Sounds like a good approach to me too.
If you have an expression like
___SMMUL(x3 <<3, 44739243 <<2)
then the x3 << 3 and 44739243 << 2 are evaluated before __SMMUL is called, so it doesn't matter if you have those calculations in the function call or somewhere else. Computationally, the values will be calculated first, then __SMMUL will be called in either case. In that respect, calculating the actual value of the constant and putting it in an init section can be beneficial, because you can tweak the exact value to get exactly the gain you need, down to the last bit.
What I'm getting at is that since you are trying to get a zero gain function for feedback loops, you might want to tweak the exact value to compensate for other rounding errors so that you get a total gain of exactly one for the whole loop.