I do multi-threaded programming, and I can tell you for a fact that it's damn hard to make an app use all CPU cores effectively. It requires the software to split up any work into a bunch of small tasks that can be run concurrently, and then the results have to be gathered and processes.
Sometimes it's impossible to break down the work into enough concurrent pieces, and you end up having to do a bunch of work back-to-back. This means you can't spread the load between the CPU cores. You also have to watch for all the gotchas that come with multi-threaded programming, such as race conditions, concurrent variable access, and cross-thread synchronisation.
I'm not apologising for Bethesda here. I'm simply stating why things are the way they are.