The cells resolve at the same time because JavaScript is single threaded, and the computationally intense cells block the main thread, effectively locking up the browser.
The only way to deal with this is (aside from performing the computation in a worker, which always creates a separate thread) is to split up the operation into multiple chunks, and pause at certain intervals to let the browser "catch up". Ideally this is done by having the computing cell return a Promise that you only resolve once the computation has been completed.
Sometimes you can also use generator cells to yield intermittent values. In this case Observable's runtime will fetch each next yielded value via requestAnimationFrame.