Well, your GetKeyState command wouldn't have the = 1 part in it; kind of surprised it works.
Anyway, of course it will only send z. You're pressing the hotkey, and then checking if you pressed the hotkey, and deciding to send z if you did press the hotkey. There's now way you can press the hotkey and not press it to send a simple RShift. This can be resolved however you want - change the If statement to something that could evaluate false.
On top of that, it's possible your RShift is recursing (right word?) into activating the hotkey. So you won't ever see a net RShift, but can only ever get the end result of a z. This can be resolved by using the $ modifier. The issue is though if you intend for autohotkey to be able to activate its own hotkeys... But that doesn't make much sense, you'll get a net RShift by using a $RShift hotkey otherwise.
Also, include a return statement.
What can be changed so that when the shift key is pressed and held indefinately, it will only send "z" once. Then press the same shift key when the key is released.
I think you're looking for KeyWait.