Broadly speaking, simplifying means reducing the number of parts to an expression. In this case, you can help by breaking things up into cases for FullSimplify[] to put back together.
In my reading of the documentation, PowerExpand[] assumes the variables are real by default; and to get PowerExpand[] to use the assumptions in Assuming[], one should use the option Assumptions :> $Assumptions. In that case, we get a different result:
Simplification means reducing the number of parts (so-called “leaves”; see the function LeafCount[]). When a step or sequence of steps creates many more leaves, the step sequence will often be rejected, even if pursuing it would eventually lead to the simplest possible answer. LeafCount[expr] is 21, and the leaf count of the Reduce[] output is 55, I’m not surprised the best solution wasn’t found. Reduce[], on the other hand, usually does not care about the leaf count.