It actually isn’t even an on-the-fly translator (other than in some rare circumstances). Translation occurs, usually, just once. Either when you first install the app, or when you first launch the app. After that, it just uses the translation that already exists (again, there are some rare exceptions to this).
Not sure why Microsoft didn‘t go that route, but it may have something to do with history. On MacOS, ”apps” are actually really folders, and inside the folder can be executables for multiple different CPU architectures. In theory you could have a single icon that, when clicked, chooses to launch PowerPC, x86-64, x86, ARM64, or whatever, because there is a binary executable for each within the ”app.” Apple’s had this capability for a long time, because the history of Mac is cpu architecture change - 68k -> PPC -> x86 -> x86-64 -> Arm. Microsoft’s executables (i.e. “.exe” files) are just binaries. So if they wanted to do a one-time translation, they’d either need to extend the .exe format in some way that remains backward compatible, or they’d have to find someplace else to put the translation. Then when you click to launch an app, the OS would have to intervene and figure out whether there is a translated version. And it would potentially have to cope with users moving executable files around, etc.
None of that is insurmountable, but it does tend to favor emulation instead.
A second problem is that, because windows attempts to be backward compatible forever, you have a lot of software running on windows that misbehaves in various ways (modifying pages of instruction memory on-the-fly, etc.). This means that one-time translation wouldn’t work for that software, and would complicate the design of the translator - a lot of the time you’d have to translate on-the-fly anyway, in which case an emulator may make more sense.