That should work unless the value was set by the opposite side (if the value was set by the client it won’t be read by the server visa versa). In that case you would need to use events to send information between server and client.
That is exactly how you would achieve that in a loop (without the use of external instances), otherwise you’ll need to make use of RemoteEvent, RemoteFunction, BindableEvent, BindableFunction and ValueBase instances to accomplish this.
The definition of depreciated means that it is no longer supported. It only exists to keep older code from breaking. Roblox has declared wait() as depreciated. I can’t even find it listed anymore.
While wait() may be deprecated, it’s mostly pedantics. task.wait() is significantly faster, so it’s going to be more accurate on when an event happens. task.wait() is better to use unless you really need that naturally longer wait time for something to happen. (I’ve had times where I need to use wait() over task.wait() because it’s just that smidge longer, without being too long)
Dantheman is right though, nearly always you’d be far better off waiting for events to run functions (PropertyChanged, ChildAdded, so on and so forth) - From my personal experience, unless you’re trying to track a billion things happening at once in mass, you’re better off using those.