I'm actually working on a similar issue right now. We have a website where specific member groups have solspace user editable member templates but don't have control panel access. Attached to those profiles, are channel entries where they can display extra information about events in their area.
The first road I'm starting down is to make it so that the coupon is one of the fields in that entry, but not editable from the public side. When an entry is created, one of the fields will be the CartThrob "Coupon Code Field", so they could actually create their own codes using that custom field. But the actual settings field is not accessible, except to the staff that has control panel access. From there I will be modifying the coupon settings field to already have the default values in place upon entry creation, so staff can change the actual values if need be.
So this solution would apply to members that don't have control panel access, and can be done with solspace user or if it is desirable to have channel profiles automatically created then profile:edit (creates profile entries upon edit) or zoo visitor (creates profile entries automatically). I just don't know exactly how I would keep it all straight if two members create the same coupon code, maybe I'll make it so that a unique value needs to be pre-pended based on that unique member id or another value unique to that entry or member. Or tell them, "This is your code, period, full stop."
The second road will be to try a variation of this price field changer extension http://cartthrob.com/forums/viewthread/4547/#21625 (Also found in the SDK, but having an issue with that version on the most recent version of EE).
Essentially the channel would have a very basic coupon plugin type that would do nothing more than set the custom data that makes the price field changer set or unset the price based on the cart contents. This second way would make it so that coupon prices can be controlled from the actual product's channel entry, so it stays consistent. If it ends up that we really need to make it so that coupons stay in their own channel, then perhaps relationships or asigned author IDs will keep things organized... but now my head is starting to swell.