You simply need to make sure that every character you want to save is inside back-referenced parentheses. In this case, just expand the first set to included the a-Z reference.
It's also easier when dealing with regex to use the -r option. That way you don't have to backslash-escape everything.
ls | sed -r -e 's/(.*[[:alnum:]])- (.*)/\1 - \2/'
Notice that I added a space after the hyphen too. Without it, a filename like artist- hyphenated-song
would break at the wrong place, because regex is greedy.
Something like this would be even better. It can be run on both correct and incorrect names, as long as there's a space after the hyphen in the middle.
ls |sed -r -e 's/([^- ]+)- (.*)/\1 - \2/'
Speaking of which, in your first expression, using the 'g' flag in sed would also affect hyphenated names.
Finally, instead of using sed, ls, and/or loops, I recommend perl rename, a convenient renaming script included in some distro's perl implementations. It uses the same general sed/perl syntax as above and works with standard shell file globbing. A stand-alone version is available here: