It's a VM in the sense that it provides services to the code that's executing in it. For instance, memory allocation, garbage collection, RTTI, etc. But to say that it's a VM in the strictest sense is probably innacurate; it's more akin to an extension of the Win32 loader in that, in addition to things like automatic relocation, it also performs compilation.
Java has HotSpot (which does the exact same thing), but you don't see anyone arguing that it isn't still a VM. By the same token, the native equivalent of .NET code is still running in a VM, because, while application code isn't interpreted, it still isn't self-sufficient. At least in my book, that's the mark of a VM: a machine that visualizes an environment.
I think that most people who see the letters VM and cringe simply don't understand what the term refers to. Virtualization and abstraction are basically synonymous. You can probably guess, for example, that there are several layers of abstraction between your hard-drive's physical platters and the pins on the outside of the box alone. You could say that the black-box is a VM to the storage media. Then there's further abstraction between the ribbon cable and the CPU (the ATA controllers), and in the operating system (the filesystem decoders), and the application software (fopen(), write(), etc).
Frankly, tagging one more level of abstraction (wrapping OS API calls) is hardly something to cringe at.