By default, GN does not do what you're trying to do.
The reason is that in order to do this you would need to have the different flags propagate down to the targets that depend on them (e.g., v8 for v8_use_external_startup_data), and then you'd presumably need to compile the target twice, two different ways. That can lead to having to build multiple things twice and that may not be the actual thing you want (but see below).
In addition, we've generally had the opinion that having flags flow down the graph in that direction makes it much harder to know what is actually affecting what: how v8 is compiled could depend on every single target that uses v8.
And, since flags normally flow up the graph, now you'd be talking about having flags flow in both directions, which seems like it could be even more confusing.
That said, there is a way to do what you want: sometimes you really do want to build the targets twice with two different sets of flags, as you say. You can use two different toolchains, one that has the one set of flags you want, and one that has the other, and declare cross-toolchain dependencies as you need them (though if you can avoid cross-toolchain dependencies, that's probably better, because that's also easier to reason about). The v8 build effectively does this when you're doing cross-compiles: one built using the target toolchain, and one using a version of the host toolchain that has the same bit width as the target. Another example of this is in the Lacros variant of the Chromium, where we build Chrome itself twice, once to be the browser and once to be the window manager (Ash). A third is in some of the multi-bitwidth Android builds (like monochrome and trichrome). And my vague understanding is that Fuchsia uses this pervasively, but I could be wrong about that.
And, as I finish typing this, I see Armando just suggested the same basic thing, more concisely :).
-- Dirk