Multithreaded coding isnt easy, all to often you end up in a deadlock, where 1 thread is simply waiting for a result from another.
Take a graphics and physics engine for instance, the physics have to be calculated before the graphics engine can render up the display.
Somethings you would think to be rediculously easy to thread, take an antique game like transport tycoon, with hundreds of truck, trains and aircraft. You would think you could just split out hundred of AI threads for pathfinding, but as soon as two vehicles want to take a similar path at a junction you get a race condition, and the two threads have to "work together" to get a single result. In the end its a lot simpler to have everything under the control of a single thread.
That said there are some extremely smart programmers, and I have no doubt that better utilization of multi cores in games will come about sooner or later.
Its probably part of the reason why Crysis struggles to make much use quads, there is too much interdependance between the threads, so one thread is idle, waiting for results from another.
Multithreading is at its greatest on tasks which are easily make parallel. Processing, and rendering video for example, which can be split into blocks of frames, and each core deals with small blocks of frames, or dynamic html web sites, where each visitor to the server can have an entire thread to themselves. The more CPU's or cores the more threads can be processed in any given period of time, almost perfect scaling.