it seems like the idea is to add a virtual machine, and the bytecode that handles the blockchain validation itself is embedded in the blocks
No, blocks contain just raw data, you can see who owns what, but it can be executed in any way, using any Turing-complete language you want. It has to be compatible with the rest of the network, that's the only required thing to reach consensus.
Who decides what updates to the bytecode should be added?
There is no official "bytecode", you just have some data in the chain and that data can be accepted or rejected by your node. If you ask about the format of the data in the chain, then all users running full nodes. You can release new version, but you have to convince people to install that version to bring your changes into reality. If developers will start doing some things that people don't like, then they can always switch to another coin (or simply stick with the old version).
For some coins, the blockchain is identical to some point in time, that's probably the easiest way to see that there is no single version matching the blockchain. Also, many miners use their own custom software (and hardware) to mine blocks more efficiently, using "generatetoaddress" will work, but using specially optimized software is better.
stop being a Dissociative Blockchain Code and become an Associative Blockchain Code
I don't agree with that. If the blockchain is disconnected from the binary code, it can be updated and changed easier than if it is connected, because you don't have to stick to some processor architecture or some programming language. Also, if you have self-upgradeable blockchain, then you can force some unwanted update just by pushing some data into the chain. That gives too much power for miners and changes them into semi-developers by letting them auto-update other nodes, which can be dangerous. Even versions released by Core are not auto-upgradeable, you have to upgrade it yourself.