I have some experience with this, but my case is rather specific so I’m not sure how it scales to other people’s usage…
This is exactly what I do… it isn’t “impossible”
It just isn’t very clear from Unity examples or other forum posts on how to do this. As you’ll see below, once the objects are setup and imported into unity I don’t need to mess with the skinned mesh renderer at all, just the bone transforms.
What I’ve done on my projects is to first setup the master character object in max w/ a skeleton and skinned modifier etc. I also setup any accessory objects (hair, armor etc.) as their own objects/files in max with the SAME skeleton hierarchy, and also with it’s own skinned modifier etc.
In Unity these are imported as separate objects. When I start the scene I only instantiate the character object. When I want to add armor to the character, I instantiate the armor object as a child of the character object, and then run a custom script which gathers all the BIP(skeleton) transforms (by name) from the armor object and then automatically searches and parents these to the BIP transforms of the target character object. This will activate the animations on the armor just as if it were a part of the character object… there is no need to apply a second animation component to the armor, it simply starts acting with the animations that are driving the character skeleton 
When I want to remove the armor, I do this process in reverse… remove all the child BIP transforms from the character skeleton and parent them back to the armor object, then delete the armor object.
This is my bone gather and transfer script… you’ll probably need to modify it for your own project but it’s pretty straight forward and I hope it’s useful…
var AttachToRoot : boolean = true;
private var isOn : boolean = false;
private var InstanceObjects;
private var checkObject : GameObject;
private var targetObject : GameObject;
private var localChildren : Transform[];
private var targetChildren : Transform[];
function Start(){
checkObject = this.transform.Find("Bip01").gameObject;
targetObject = this.transform.parent.transform.Find("Bip01").gameObject;
}
function LateUpdate(){
if (!isOn){
InstanceObjects = new Array(0);
if (AttachToRoot){
//ATTACH ALL BONES TO PLAYER BONES
var namePath = "Bip01";
if (checkObject != null){
var localChildren = checkObject.GetComponentsInChildren(Transform);
var targetChildren = targetObject.GetComponentsInChildren(Transform);
var ob = 0;
for (var child : Transform in localChildren) {
ob +=1;
}
InstanceObjects = new Array(ob);
ob=0;
for (var child : Transform in localChildren) {
if (child.name !="Bip01" child.name !="Bip01 Footsteps" child.name !="Bip01 Chin" child.name !="Bip01 ChinNub"){
namePath = namePath+"/"+child.name;
if (child.gameObject != null){
for (var targ : Transform in targetChildren) {
if (targ.name == child.name){
child.parent = targ.transform;
child.position = targ.position;
child.rotation = targ.rotation;
child.name = targ.name+"("+this.transform.name+")";
InstanceObjects[ob] = child.name;
ob+=1;
}
}
} else {
Debug.Log("ERROR: This sucker won't load : "+namePath);
}
if (child.childCount <= 0) namePath = "Bip01";
}
}
}
}
isOn=true;
}
}
function RemoveAll(){
if (InstanceObjects){
if (InstanceObjects.length > 0){
for (lp = 0; lp < InstanceObjects.length; lp++) {
if (InstanceObjects[lp] !=null){
this.transform.parent.gameObject.Find(InstanceObjects[lp]).transform.parent = this.transform;
//Destroy(GameObject.Find(InstanceObjects.lp));
//InstanceObjects.RemoveAt(lp);
}
}
}
}
}
This code would be saved and attached as a component to any “accessory” object. Once that object is instantiated and made a direct child of the character object, the script runs and automatically and should attach the bones to your character. When you want to “detach” you need to call the RemoveAll() function on this component.
NOTE: This was made with 3dsMax “BIP” skeletons in mind, and has not been tested on anything else. Results may vary 