No language or environment that uses UTF-16 validates it, ever. Not a single one that I know of. But that doesn’t make it UCS-2, it just makes it potentially-ill-formed UTF-16.
Your points about normalization only matter in so far as Windows is generally setup to be case insensitive (which can be disabled).
All UTF strings face normalization issues for a whole host of reasons.
Wouldn't that break spectacularly? The whole "the fs is case insensitive" assumption has kind of been a given on Windows for about 40 years now.
I remember accidentally creating an NTFS flash drive with two names with difference cases in Linux. Windows programs sure didn't like that.
Doing a string validation check in every single API call would waste cycles for no good reason.
Interpreting a string as encoding text in particular character set is, as far as the kernel is concerned, a problem for userspace.
Windows does make claims of "supporting" UTF-16.
Windows supports UTF-16, it doesn't guarantee UTF-16 correctness. The native methods annotated with the W suffix all take UTF-16, so unless you want to render your own fonts, you're going to need to provide it with either that or ASCII.