I could understand why this game would be really difficult to multi-thread, but I also see a definite need for more CPU power for this type of simulation. With city simulations the level of complexity is huge because there is so much overlapping dependencies. Because of those dependencies it makes multi-threading operations difficult.
The way they have designed the simulation suggests they should be be able to use Agents to get a lot of parallel computation for much of the simulation and the hard stuff (The A* searches). However any updates that have to happen to the game world, like taking a job would need to be synchronised or also based on agents. So you could have 10's of thousands of agents at the core, one for every building, road tile, job and sim. It would potentially scale quite well but it would be a massively more complicated implementation.
Other strategies like Mirrors and immutable data structures wouldn't really be all that efficient for this sort of structure as its quite deep and wide in places, and the rate of update is frighteningly high per frame. When almost every data point is changing an immutable data structure is going to be inefficient for individual updates accumulated. Nice and easy to test but not good for getting parallel behavior in this case. You could also potentially split the world into 4 quadrants and deal with the synchronisation on the edges but the quadrants don't help much as anything that could cross the boundary needs locks.
Unfortunately I can't think of an obvious strategy they doesn't involve a lot of fine grained synchronisation points, which means it would be a nightmare to code this game with multiple threads. Its not a trivial problem as I think it through.
I have a simpler world simulation in development (lots of bouncing balls) and I can tell you its very difficult to multithread that reliably due to the interactions between them and I Simcity is much more complicated.
I am disappointed with the world size but as a programmer I can't see an obvious way to make this better with fine grained task or agent development nor immutable data structures. If I were in the dev team I would have thought hard about it and maybe I would work out a strategy but on the surface its not immediately obvious how you would do it. No general strategy would work across the entire game world, nor is there an obvious boundary for course grained threads.
To say concurrency and parallel computation is a challenge is an understatement, its basically impossible to get right but all the simplest of problems right now. The tools are just so primitive, most people have no idea how error prone it is to write software that uses many threads. I have seen a lot of bad multithreaded code and none that was good, literally zero lines. I suspect in the general case we will never find a solution, I suspect its impossible although I can't yet prove it.