Not trying to resurrect an old thread, but leaving the below comment after ending up here while following links of a recent discussion.
There was work I did for FetchContent which avoided using a sub-build, but I had to revert it after it broke some existing behavior. I still harbour a desire to bring that change back in a form that avoids the previous problems. The performance gains on Windows especially make that highly desirable. As a nice side benefit, it would remove the above-mentioned problem and allow the original pattern discussed in this post to work (download the Ninja build tool via FetchContent before the first project()
call).
I don’t know if or when I’ll get a chance to revisit that work for FetchContent, but it is still very much on my radar.