It appears that in the code above, a.a is a primitive and therefore should be copied, same for a.b. I can rewrite the code below by extracting the second argument to my function, and the compiler will completely accept this:
let other = &mut A{a: original.a, b: original.b};
m_borrow(&mut original.b, other);
Currently borrowck just evaluates the arguments to a function in order most of the time (the one exception being two-phase borrows). Because the b field was borrowed first, it can't be accesssed until the borrow ends. It could in theory accept this in future if it did more complex analysis, involving changing the evaluation order if there are no side-effects involved, but I don't think there are any plans for that at the moment.