Easy (conceptually) solution: a button on the dock that you need to press to complete the unlock. When you scan the QR code, CitiBike looks up which dock it thinks the bike is in, then waits for you to press that dock's button before releasing the bike.
Assuming that there is no feedback during this process coming from the bike, what is the thief going to do? Sit there for an hour constantly pressing the button?
The thief would just observe, from a distance, and wait for someone trying to scan the fake qr code. When he sees the victim, he pushes the button and steals the bike.