Skeleton setAttachment set a slot's attachment, as described there. It does that very narrow job. Generally you set a skin (either configured in Spine or at runtime) then you can use SetAttachment to set specific attachments, or set the slots to the setup pose, or apply animations to set attachments.
The concept you want is described here:
https://esotericsoftware.com/spine-runtime-skins#Creating-attachments
See the spine-unity examples for concrete details on how to do.
Attachments are completely stateless. They can be shared by any number of skeleton instances, even skeletons that have different SkeletonData. You can also set the same attachment instance on multiple slots in the same skeleton.
chrisoshea to use multiple skins means setting it all up in spine in advance
Spinebot showed combining multiple skins. Those skins can be setup in the editor or created programmatically.
For your use case you want to create template attachments in the editor, then at runtime duplicate them and change the texture atlas region they use. This means you only configure each type of item in the editor, then you can apply any number of images to each type without any manual work in the editor.
chrisoshea My main question is what is the best most performant way?
There is really only one way. Once you get it working, to ensure good performance you'd want to pack the image in use into an atlas at runtime, otherwise drawing can't be batched and you may have slow rendering from many draw calls.
chrisoshea Should I find, copy and change the region on an attachment, OR duplicate the skins (arm skins, head skins etc) and then change the attachment on each of those skins?
The end result is the same, do whichever is more convenient for organization. If you duplicate and change skins, you need to copy them into a single skin to set on the skeleton.
Usually you don't have a skin for each arm, leg, etc. Skins group attachments. If you always set the same set of arms, legs, etc then you don't need separate grouping. For example, instead of lizard-arm and lizard-leg skins, just have a lizard skin that has both arms and legs. You'd only use separate skins if you want to mix lizard arms with various other legs.
Another example of using skins for grouping is a shirt that has left arm, torso, and right arm attachments. You can set all those by setting or copying the shirt skin. Otherwise you have to know which 3 attachments make up the shirt. The skin stores that grouping information, or you can store it yourself in your app.
For templates, you may not need to use skins for grouping at all. The minimal setup only needs 1 skin and each skin placeholder has the template image for that type of item. Each is sized to be the largest of any image for items of that type. At runtime you know what images you want to use for each placeholder and you assemble a skin that has template attachments duplicated with those images. If you have an item like a shirt that is 3 images, you probably store that information in your app.