I can think of a couple of reasons on top of my head:
It's lengthy
It takes time. You're basically creating 2 programming languages - the high-level language and intermediate language (bytecode). That means thinking of 2 designs, writing compilers, lexers, linkers and all accompanying tools. No one guarantees that it will get popular, especially because it has to compare against mature ones like Java, C# and alike. Then, you have to code it for every operating system out there, every file system and every similar variable dependency (not literally, but the more the better). Even Oracle isn't doing a perfect job, just see I/O, I remember I was wondering for quite a while what have I done wrong before discovering that File#renameTo is extremely unreliable.
You need to achieve really good performance
Meaning, you have to compile and optimize your code while executing it, without the user noticing. Like compiling it for the first time (to bytecode) wasn't enough. It's not something you can do overnight. And again you have to beat JVM, .NET, ART and many more already there.
Nonetheless, there are many virtual machines out there and probably more in the making. It's also easier to compile to the bytecode of the already-made VM, so you have e.g. Jython which works with JVM, but its high-level part is actually (very similar to) Python.
I'll add more as I remember.
EDIT: To clear this up, since you seem to be mixing up terms: you don't need a VM to make platform independent apps (you can compile them for every OS, etc) and not every VM works on every OS (e. g. .NET works only on Windows).