Read up on DistributeDefinitions and SetSharedVariable. Your question is also the correct answer: Parallel instances read a global [via the default DistributeDefinitions] but do not set a global [unless SetSharedVariable[x] has been executed on each global variable x].
The parallel kernels run independently. "Shared" resources in RAM are not shared so much as copied between processes.
Generally, one avoids SetSharedVariable, since interprocess copying is not very efficient. Instead, return the data from each kernel, if possible. For instance:
{ret1, ret2, ret3, ret4} = Parallelize[foo /@ Range[4]]