I'm noticing that detachSkin() and attachSkin() are being called during commitProperties() after createChildren() has created a skin declared with skinFactory or skinClass in a Flex.Event.PREINITIALIZE handler.
I know this is a bug but, don't know how you guys want to fix it. From what I see the easiest way to do this is place skinChanged = false in createChildren() like you have done in commitProperties().
Doing the above would then prevent the pass in commitProperties() of running again. The flag skinChanged is getting set true in the pre styleChanged() call before the stylesInitialized() call.
My bad; I had created a custom SkinFactory class that had a pre created instance, I forgot to set the generator of the ClassFactory superclass.
But not setting the generator the logic in validateSkinChange() thought it couldn't skip a reload since the current skin type didn't match the generator skin type.