(a) Because rebase is run on the branch to be rebased, but merge is run on the branch being merged to, that reverses the parents of the merge commit and puts it on the rebased branch rather than the parent.
(b) Even if that were fixed, it alters the rebased branch, rather than stopping and warning in an unexpected case.
I really do want the natural semantics of merge --ff-only --no-ff.