A1. It depends on your design. A parent can help to establish IPC between its children by allocating necessary IPC structures (pipe, shared memory etc) and by propagating the IPC keys to the children. If the parent makes all the necessary work for the structures allocation and keys propagation, you may use any IPC approach without any restriction. If the parent does not establish IPC between its children or does not share IPC keys among them, you do have a restriction like any other IPC between not related (not forked) processes. In that case, for example, you cannot use a pipe, but still can use a shared memory or a named pipe (think about key or name convention).
A2. If the parent wants to communicate with a child, it can (and should) use IPC, because they are different processes. Since the parent and its children are related processes, any IPC type can be used with no restrictions.
A3. Since the threads belong to different processes, you need to use IPC. What type of IPC should be used? It depends on your design. Answers 1 and 2 attempt to explain it.
A4. Because the threads belong to different processes an IPC is needed. Because the processes are related (parent and child), theoretically any IPC approach can be used.