1) If you have a regular sub-process, it is modelled as a part of the parent worklfow (in the same BPMN and as a child of the <process> XML element). If the sub-process you want to call is subject to change, independent of the parent-process, you can use a call-activity. The sub-process that is called is an EXTERNAL process (not part of the parent BPMN, but lives in it's own BPMN). This allows you to redeploy the child-process without the need to alter the parent-process. A normal sub-process is treated as a direct child of the process-instance, so you can access the parent's process-variables from within the sub-process. On the contrary, a call-activity does not have access to the parent variables and is a "process instance" itself. You can expose variables from the parent-process to the call-activity by using the in/out declarations (see userguide).
2) If you want to run a sub-process in parallel with other activities in the parent-process, you'll need to add a parallel gateway in front the sub-process element and the "normal" activity in the process. At the point where you want to join the two parallel paths (normal activities in parent and subprocess as a whole) you add another joining parallel gateway (see userguide for fork/join example). The parent process will only move past the "join" gataway IF both subprocess is complete and normal activities before the join in the parent are complete.
3) If you have a sub-process, all sequence-flows in that sub-process should have a target that also is part of the sub-process. You cannot, for example, make the subprocess flow to a userTask that is part of the parent-process. For subprocess-to-parent communication, use boundary-events or similar mechanism.
Hope this answers your questions…