Multithreading is not as simple as setting a compiler flag, but it's also not an indivisible design foundation that must be all-or-nothing. Toady can start by making more formal interfaces to tasks so that they accept a state-of-the-world and return output (which may or may not be a copy of that data structure in a new state). At first everything would still be executed sequentially, but the "encapsulation" troubleshooting won't be commingled with timing troubleshooting. Once there are a handful of severable tasks, then he can worry about spawning threads and weaving the results back in.
Of course, it makes sense to have a notion of how multithreading works before the start to identify the relatively low-hanging fruit.
The reason I said that multithreading "may or may not help" is because the updates that cause lag are already stuttered across time (growth checks every ten ticks, flow is not calculated for every tile every tick, temperature is only checked when certain events occur, etc.). Players may not see a performance boost from a multithreaded simulation, but the simulation itself ought to be smoother. Fortunately, this means that if some update cycles that take several ticks per run, it won't alter the fundamental nature of the game. Though it will probably affect edge cases like carving fortifications into warm stone.