То что ты назвал "виртуальной машиной JS" на самом деле можно рассматривать как черный ящик, у которого на вход подается код (JS или Wasm) а на выход выдаются вполне реальные машинные инструкции. Что происходит внутри зависит уже от конкретной реализации движка. Но скорее всего внутри сидит несколько штуковин которые набрасываются на кусочки твоего кода (давай считать что это тела функций) и генерируют из этих кусочков особые структуры данных. Эти структуры данных нужны чтобы генерировать крутой и быстрый машинный код (в процессе генерации эти структуры анализируются и преобразуются). Проблема только в том, что не все языки хорошо подходят для такой генерации. JS, например, очень динамичный да еще и со слабой типизацией. Так что черному ящику в процессе приходится нелегко :)