Because the material is shared across all instances of that skeleton, changing the material properties affects all instances.
You can read more about it here: https://github.com/pharan/spine-unity-docs/blob/master/Rendering.md#materials
The SkeletonRendererCustomMaterials
component is just a basic serializable solution, best used in the cases you don't want to have to write the code.
But you can do what it does in your own code. Basically:
skeletonAnimation.CustomMaterialOverride.Add(originalMaterial, newMaterial); // to enable the replacement.
skeletonAnimation.CustomMaterialOverride.Remove(originalMaterial); // to remove the replacement.
If you don't want to manually create every replacement material, you'll probably have to instantiate copies through code as well.
Material newMaterial = new Material(originalMaterial);
newMaterial.shader = specialShader;
And you'll probably want to cache that too if you don't want it to create a new Material every time you need the same one.