Not to ask a silly question, but...
Why not first *UNESCAPE* the text? Which is what, I think, Philip was assuming you would do. And then do the replacement on the unescaped text.
But anyway, your use of /^ means that it will ONLY find characters at the START of the text. That is, it will only replace the characters you are specifying if they are the first character in the string.
var newstrchanged = strEscaped.replace(/\%(22|27|3A)/gi, ' ');
Equivalent of Philip's code, but using the escaped versions, instead.
You may not need the \ in front of the % but it doesn't hurt to use it to be safe.