I just did a game where the player is chased by one or several "muggers", while he tries to recover his stolen "gold" in various rooms. The action of the player is a big loop, but basically just gets the latest keystroke from the user (if one has been pressed), and makes a few updates to the console as the player moves around. When that loop has completed several iterations, or a small amount of time (roughly a tenth of a second) has passed, then the "muggers" moving loop function is called, and the muggers all move to give chase. They don't loop until the muggers move, the loop runs until another tenth of a second has elapsed. Health points and gold numbers are updated on the screen, and then it's back to the player's loop again.

The key is to adjust the time spent in each of these two main functions that control movement in the game, and to have all the muggers move in the same loop, even though they are in different locations in the room. I know it's not multi-threaded, but even to me, it LOOKS like it's multi-threaded (which my compiler supports quite nicely). When you press a key, the "muggers" react instantly to it (apparently).