Yeah, it looks like spRegionAttachment_updateOffset is only getting called during loading from JSON file.
{X, Y, W, H} is zero because those are attachment adjustments. The slot can has different attachments that aren't necessarily positioned the same. Like different sized guns that sit in the slot differently, or hair that sits higher on the head.
The { X,Y,W,H } values are set in the editor for how the attachment sits in the slot. For the Hair, you're doing a straight replace (assuming with different color) but one day you might have a bigger piece that needs to be positioned differently.
That day, you're either going to need a list of {x,y,w,h} for each programmatically generated attachment or you're going to have to create a skin in the spine editor that has all the extra attachment pieces. I'm assuming that you don't want to load all the different attachment replacements in memory, just the ones you need.
I'll stop there before I get on a tangent how atlases save more memory than loading individual sprite textures....