I think there's 2 ways you could go about this
1-Make characters never intersect eachother
If all root motion movement first gets translated into a characterBody.RelativeVelocity and then gets "solved" by the character update, you should theoretically never end up with characters intersecting eachother.
Let me know if that's already what you're doing though; that would mean I have to investigate why characters intersecting ends up being possible
You should also customize the IsGroundedOnHit character callback in order to make characters unable to consider themselves grounded on other characters, so they won't just stand on top of eachother.
2-Customize decollision
The character doesn't offer an obvious way to customize decollision (I'll take note of it as something worth adding in the future). But here's what you could do:
In your character PhysicsUpdate, where we call all the main character update steps, you can insert a step right before CharacterAspect.Update_MovementAndDecollisions. Here you can do a CalculateDistance check and move the character transform out of the collision before the regular character decollision update happens.
You can make this efficient by only doing this manual decollision step if characterBody.GroundHit.Entity exists and characterBode.GroundHit.Fraction <= 0f. That way, you'll only have to check manual decollisions when the CharacterAspect.Update_Grounding ground check cast already determined that it detected a hit that was overlapping the character