That is expected behaviour, yes. When you instantiate a copy of the prefab, the new instance gets a fresh SkeletonAnimation (or SkeletonGraphic) component, which reinitialises its skeleton from the original SkeletonDataAsset. Because the repacked skin and its generated texture/material are created at runtime and only live on the original instance's skeleton, they are not part of the asset and therefore don't carry over to the new instance automatically.
Here are a few approaches to solve this:
Store the repacked skin and material on your manager, then apply them to each new instance
After you do your customisation and repack on the source object, save references to the resulting Skin, Material, and Texture on your manager class. Then, whenever you instantiate a new copy, apply those stored values to the new instance's skeleton right after instantiation.
// On your manager, after repacking:
Skin repackedSkin = runtimeSkin.GetRepackedSkin("Repacked skin", materialTemplate, out runtimeMaterial, out runtimeAtlas);
skeleton.SetSkin(repackedSkin);
skeleton.SetSlotsToSetupPose();
// Store these references
storedSkin = repackedSkin;
storedMaterial = runtimeMaterial;
storedTexture = runtimeAtlas;
Then when a new scene instantiates a copy:
// On the new instance's SkeletonAnimation:
var skeleton = newInstance.GetComponent<SkeletonAnimation>().Skeleton;
skeleton.SetSkin(manager.storedSkin);
skeleton.SetSlotsToSetupPose();
newInstance.GetComponent<SkeletonAnimation>().GetComponent<MeshRenderer>().material = manager.storedMaterial;
Use the source object directly instead of instantiating a copy
Rather than copying the prefab each scene, you can simply move or reposition the existing persistent source object within each scene, since it already has the correct skin applied. This sidesteps the problem entirely.
Rebuild the skin on each new instance from the stored skin choices
Instead of storing the repacked result, store the list of skin names the player chose (e.g. "hair/brown", "clothes/hoodie-orange", etc.) on your manager. Then after instantiating a new copy, rebuild and repack the skin from scratch using those choices:
Skin runtimeSkin = new Skin("runtime skin");
runtimeSkin.AddSkin(skeletonData.FindSkin("skin-base"));
runtimeSkin.AddSkin(skeletonData.FindSkin(manager.chosenHair));
runtimeSkin.AddSkin(skeletonData.FindSkin(manager.chosenClothes));
// etc.
Skin repackedSkin = runtimeSkin.GetRepackedSkin("Repacked skin", materialTemplate, out runtimeMaterial, out runtimeAtlas);
skeleton.SetSkin(repackedSkin);
skeleton.SetSlotsToSetupPose();
This is slightly more work per scene load, but keeps things clean and avoids holding onto runtime textures longer than necessary. Remember to call AtlasUtilities.ClearCache() after repacking if you won't be doing more repack operations immediately:
using Spine.Unity.AttachmentTools;
AtlasUtilities.ClearCache();
For more detail on the repacking workflow, see the spine-unity Mix and Match documentation and the Spine Examples/Other Examples/Mix and Match example scene and MixAndMatch.cs script included with the spine-unity package.