setFromRotationMatrix is incorrect when scale is negative on any axis. matrix.decompose returns correct rotation.
I assume this is because the following code is missing in setFromRotationMatrix (present in matrix.decompose):
// if determine is negative, we need to invert one scale
var det = this.determinant();
if ( det < 0 ) sx = - sx;