Hi Nathi,
Actions were covered in the fundamentals of animation. There’s even an exercise to help deepen your understanding of how Blender stores its animation data, and how you can reuse that if needed.
https://cgcookie.mavenseed.com/exercises/master-your-animation-data
I do think, however, that your solution to parent to an empty is a good one.
If you want the same animation you can use the same action. If you want them to be offset in location, rot, scale. (empty is good option)
If you need it to be offset in time, either a new copy of that data or using the NLA will be your best bet.
Hope that helps.