In a multi-threaded build, there is a small look-ahead to see what can be built in multiple threads.
But, for each build node, it is just evaluating a Module, and generating a command line, when it's ready to build.
I have not measured this, but I suspect there is a bit of stall time when all threads are busy building Modules, before the next command line is generated, especially as doing a build step for a Module can be time consuming.
Evaluation only occurs when the next Module is scheduled.
But, generation of the command line, in theory, can be done up-front, since all paths, and settings, are known.
The actual build, then, is about evaluating, and running those pre-generated command lines.
One could even do some comparison of the command lines to check for changes, assuming that's not expensive. (I'd make it opt-in.)