I'd do this slightly different; master is your common integration work branch-{a,b,c} are specific release branches, and you maintain a specific 'upstream' branch, importing from said upstream.
The gain there is that you've got a specific area to continually fold changes into, building towards new releases- with the expectation that each branch-{a,b,c} is likely to be derivative (closest) to that common branch point.
Regarding managing the common branch, from the sounds of it you're doing occasional merges/cherry-picks; this works fine, and such a structuring makes it easy to occasionally do a rebase of the common to eliminate noise/dead CLs, minimizing the historical delta from the actual upstream.
Regardless of the approach, I suggest you take a step back and try to decide if you consider your work the true 'master' for others (they'll be pulling from you), or if you're a derivative of some other upstream. What I described works reasonably well if you're a derivative; if you're the 'master', then you'll probably want something different.