Cool history, but it's a false dichotomy and a bit of motivated reasoning.
Moving everything onto a single thread makes interruptibility easy, but it isn't a scalable approach. It mostly works for a phone screen, and it breaks down once you try to extend it to bigger UI surfaces like desktop, or to more complicated interactions.
At React Native we ran into exactly the same question and rejected both paths. That's why we built a concurrent renderer and concurrent layout: product logic, animation logic, interaction logic, and all the background work are separated and run on their own schedules.
The idea is that product logic and UI rendering run independently, but when an interaction lands on the main thread, the engine can deliver and process the event synchronously, all the way through platform native code, React, layout, and drawing, on a single sync path, without waiting on anything else in flight or blocking it. Yes, JavaScript is still single-threaded, but React Fiber effectively makes it interruptible.
The other half of the story is that we never finished it. I can be wrong, but as far as I know, sync events still aren't a thing in React Native.