Well as I said you shouldn't modify string constants so str1[<anything>]^=<anthing> should throw an error - a compile time error if nothing else.
However if it works, to find out why 'M' xor 'e' produces '(' you'll need to look at an ASCII table and the binary values of those three characters.
'M' xor str1[4] = 'M', since str1[4]=0 (it's the terminating NULL). And as I said above, xor-ing anything with zero has no effect.