In your specific case, you can have a
foo_sources = [ ... ]
at the top of the file and then reference this below
sources = foo_sources + [ "bar.cc" ]
in the various places so you don't need to respecify the headers. I don't know how well this will scale to an entire project or how much this will need to be duplicated.
You can encapsulate much of this behavior in a template. Fuchsia does some of this kind of thing in templates (adding suffixes to deps labels), but IMO it does too much in some cases and the discoverability isn't great and the failure cases are unpleasant. I believe Fuchsia will do things like have "some_special_deps" variable that is processed by appending suffixes, and then another template deps variable that has the normal behavior.
Your examples said "in most cases" and "oftentimes" and that means that if you made a way to do this you have to have a way to override the default behavior. And the default behavior and the override syntax need to be discoverable by somebody who doesn't know what they're doing.
My feeling on the build is that almost nobody that's changing the files knows how it really works, so it's better to be verbose in a straightforward way that can be copy/pasted and changed in an obvious way than have magic that won't be discoverable by such users.
Brett