Indeed, the memory manager of your operating system creates a virtual memory space for each process (processes have different memory spaces; threads share the same memory space within a process).
Within the memory space of a thread, each thread has its own stack. However, they share the same heap and clever memory management techniques are used to optimize the shared usage of the stack (see Memory Allocation/Deallocation Bottleneck? as a starting point).
How does OS manages if stack space is full for one thread?
The OS does not manage the stack. The stack is a static data structure created by the compiler. The memory allocations and memory releases from the stack are managed by the compiler, and it knows at any time the size of the stack. Thus, it can split the static memory region of the memory space (i.e. the whole "stack") into thread "sub-stacks".