I've been wanting to do something like this for Chromium for a long time: Most people don't hack on the blink code for example, so we could just download a prebuild libblink_core.so.
But it's not obvious (to me, at least) what a good way to implement this would be. You want something that says "if any of these build inputs have changed, we have to run this part of the build graph locally, but if not, then replace this whole subgraph with a single node that computes a hash of all the build inputs and flags and downloads the build output from somewhere if it's already been uploaded – but if it doesn't exist remotely then nevermind, I'll take the local build graph actually".
I think this can be done at the generator level, but then you'd have to do it for every linkable build target that exists, even if you only want to build a subset. Alternatively, you could make the generator a "we need to do the can-we-download-check" build rule for each linkable target that, when the target is built, does the check for that target, and then re-runs the generator.
(I don't know off the top of my head if this dynamic generator rerunning can currently be expressed; I think currently ninja only supports a static list of generator dependencies.)
So I think it's a good idea, but the implementation would need lots of prototyping to find a design that's simple.