Channel Access subscription updates are triggered by the database, there is practically no way around that. Changing Channel Access to allow the client to define the update rate would need a compatibility breaking change in the wire protocol, major code changes in the CA server etc.
I see three feasible ways to achieve the required behavior:
1. Add records for the slower update rates. One more input record of the same type per signal, with a periodic SCAN of the desired rate and an NPP input to the fast signal. If you want to do averaging or other decimation math, use a compress record in front of your slow record.
2. Write a server-side filter that implements a reduced update rate by throwing away updates that are too fast. The filters that are part of base (in src/std/filters), especially the sync filter, give hints how this should be done. A filter that implements a client-defined maximum update rate would definitely be interesting enough for inclusion in base.
3. Have the client do periodic get() requests instead of a subscription. Yes, that would do a request/response message pair every time, but if you are trying to get from really fast update rates down to once per second, doing a full cycle once per second is not that far off.
Cheers,
~Ralph