Regarding declarative style and re-building the whole scene every frame. My engine does exactly that, and it does that for exactly the reason of performance. The key is to prevent THREE.js from doing any unnecessary work when an object is added to the scene, and to re-use objects whenever possible .
When it comes to state and mutators - I think there’s nothing complex there, it might take a while to create all necessary mutators, but not because of their individual complexity. It will depend on your usecase how many mutators you will need.