The real problem, I think, is combinatorics iduced by the number of conditionals in a source/header file.
Most header files are full of conditionals. "Precompiled" implies that the conditionals have been resolved... unfortunately, if you choose to resolved conditionals just to true or false, and you have 20 of them, there are ~~16 million possible configurations. (And we aren't even counting the defines that are scalars but not boolean values, or are parameterized macros).
If the usage is such that one configuration is needed, you can get by with one precompiled header file. Interestingly, for an individual developer this seems to be pretty common, which is one explanation for "only one". But if the configurations change rapidly, either one needs a huge number of precompiled headers, which has its own cost (imagine "precompiling" 16 million preconfigured headers), or one must generate them on demand (oops, this is the situation we were hoping to avoid).
One might duck this two ways.
Much of the cost of "precompiling" is simply processing the text. If compilers broke header files into the consitutent tokens, and stored the tokens, then that text processing time could be largely avoided, even if the conditionals were still evaluated every time. I've never seen (but haven't looked very hard) for a C or C++ compiler that did this.
Another possibility is to precompile and store every combination a user actually uses, and store them indexed by the configuration. Then lookup would be easy to find the "right" precompiled header. I suspect this would top out for a single user at a modest number; who has time to experiment with hundreds of configurations?
A sort of far out idea is to symbolically evaluate the conditions. While many are independent, some of the conditionals control the configuration of others, so there is a complex set of constraints across the conditions... One could precompute these combinations, and then precompute the possible configurations. There might be a lot fewer useful combinations in practice.
More practical might be to isolate groups of interrelated conditionals. In essence, you get a lot of smaller header files each with fewer conditionals. If they get small enough, you might actually be able to precompute the space of choices for the smaller files, and then simply choose the right one. You'd have to attach a preprocessor configuration description to each one.
Usually the best solutions are ones that are hybrids. I'd expect that storing the tokens rather than the text, splitting up conditionals as above, but leaving some file with some unevaluated conditions, to actually be "processed" would produce a pretty useful result.
Alas, I shall have to leave these ideas to the enthusiasm of others to implement :-}