While a Wait is processing, other triggers or other running instances of the same trigger are not locked, they work simultaneously. Thus, they might overwrite global variables meanwhile or create states you have not accounted for. That is not only the case for Waits but also when you have actions in the middle of the trigger that fire other events because these events will be handled first.
Basically, to avoid this, you need to store your data distinctly in independent memory areas. As defskull stated, one method would be local variables. They are bound to the instance of the call of the function they are declared in, means everytime you run the trigger, there is another variable. Hashtable and global structures are better for timers instead of Waits because after a Wait there is not a good way to identify the instance you are in. A timer presents itself as event response, so you can attach data to its handle id for example.
For GUI users, it might be better to use Waits + local variables (which must be realized by single jass lines though, use the Custom Script action) for better readability and less different jass lines. As you advance in jass, you normally get rid of Waits in the very most cases.