As you've seen, if updates are available in a channel to which a system is subscribed, the system will see the updates.
We run the commercial product, Satellite, so there may be some differences in functionality. But, what we do is have multiple base channels, each of which is a copy of the main RHEL 5 distro. Then, we selectively push updates to those base channels, based on where its machines are in testing the updates. What we do differently is sync the updates directly to our base channels, not child channels. But then, when we feel comfortable with a set of updates, we bring the channel entirely up to date, so that it matches the original RHEL channel.
What you don't want to do, as you have seen, is swap machines between channels. You COULD do it with activation keys, but it gets tricky.
Another solution is to have a third level of channel - for only critical updates. Like so
Tier 1 - base RHEL distro
---Tier 2.1 - has updates you want ALL machines under Tier 1 to get, so a LIMITED set of updates
-----Tier 3 - has critical updates
---Tier 2.2 - has all updates
Machines in Tier 1 ONLY would only see the base installation packages
Machines in Tier 1, and also Tier 2.1, would get updates that you want ALL machines to get. Call it a baseline update level.
Machines in Tier 3 would see everything from Tier 1 & 2.1, and also updates you deem critical.
Machines in Tier 1 & also Tier 2.2, would get ALL updates.
This is a bit more complicated, and requires more management for pushing out updates. This is where the API comes in handy.
I hope this helps.
Brian Collins, RHCE
Sr. Systems Engineer
Southeastern Data Cooperative