The first instance of '.*' needs to be turned into '.*?' and you probably want something other than the '(?:-_-.*)' part of your pattern.
What '.*' tells the regex engine to do is to match all characters (with the possible exception of the 'newline' character spending on the setting of the "singleline" option which you have not told us) from there it is within the string to the end of the string (or line). In general this is too much and when ti comes to match the '-_-' part of your pattern, it has to backtrack through the characters it has already matched until it gets to the required sequence (or has backtracked to the starting place of the '.*'). Therefore this becomes, in effect, a search from the end of the string/line back towards the start for the last instance of whatever follows the '.*'.
If I were asked to do this I would probably use one of the many URL parsing classes that are available to do the work for me. However, if I HAD to use a regex pattern and I had the .NET regex variant available to me 9as you do) then I would start with the pattern:
cm_mmc=((((?!-_-|&).)+)(-_-)?)*
and look at the capture array for match group #2 as it will contain the items you are after. Based on your test string there will be 2 matches and each match will have 4 captures for match group #2. (You could use match group #1 as well but the text there will have the delimiter in it as well except for the last one)
Susan