If your history looks like this:
[M1]--[M2]----[M3]---[M4]----[M5]----[M6]
\ \ \
[B1]--[B2]--[B3]----[B4]----[B5]----[B6]
Where M# is a changeset on the default branch, and B# is a changeset on an existing branch and B3 and B5 are merge changesets, and your goal is to get something like this:
[M1]--[M2]----[M3]---[M4]----[M5]----[M6]
\
[B1]--[B2]--[B4]----[B6]
THen you can get that by doing:
hg update M1
hg branch new_branch_I_want
hg graft B1 B2 B4 B6
That will pull those changes into your new branch. Of course the old branch will still exist in its unmodified state. Since graft skips merge changesets you could probably specify the entire B1::B6 range, but I've not tried it.