In this example, the aim animation rotates the node that the IK handles are grouped to. The shooting/recoil animation moves the IK handles.
It seems so obvious now that this is the correct way to do it; I'm not sure why I didn't think to do it this way earlier. This system uses the IK handles directly, so the hands are always placed correctly. It's also more flexible and consistent than what I had in my previous post.