String is indeed a reference type. However, when your Main method calls changeMe(str), .NET passes a copy of the reference to str to changeMe in the param argument. changeMe then modifies this copy to refer to "I have changed you!!!", but the original str reference still points to "I will never change".
Being a reference type means that if you changed the state of the passed string, the caller would see those changes. (You can't do this to a string because strings are immutable, but you can do it to other reference types e.g. Control.) But reassigning a parameter doesn't change the value the caller passed in that parameter, even if that value is a reference.