'How are the stacks arranged?' - dynamically allocated by the 'CreateThread()', (or whatever it's called), API, called from the OS loader for the main thread, and subsequently by the main thread and others to create more threads.
'How do we ascertain the space a thread would need?' - on desktop systesm/OS with large virtual memory spaces, compilers/linkers usually specify a large maximum size, (eg. 1MB), for the stack of the main thread. This value is stored in the executable file header and used by the OS to reserve the 1MB, or whatever, of virtual address space when the executable is loaded. The OS commits to physical RAM/paging a much smaller minimum stack when the main, or other, thread is started.
'What if a thread overuses the stack space it was allocated?' - if a thread overuses its committed stack, a page-fault interrupt is generated and, if the reserved stack limit is not reached, more RAM is committed to extend the stack. If the limit is reached, a small 'overdraft' of a page or two is committed and an exception raised in the offending thread.
'return address of the interrupted thread. What exactly is this return address? The PC is sufficient to tell us which instruction would be executed next, so what is the use of this return address?' Typically, the PC is not explicitly saved. The return address is saved on the stack by the hardware/software interrupt mechanism that generated the entry to the OS code from the user app code. So, saving the stack-pointer efectively saves the PC, (and often a pile of registers etc. as well, before a switch is made to an OS stack to implement the interrupt/system call).