A child always lives in the local space of its parent. You can easily check that by noting the current coordinates of a child that show up in the properties panel ("N"), moving the parent, and then comparing the new coordinates of the child with the first set. They shouldn't have changed, i.e. they can't be global).
At the time of parenting, the child object takes note of the parent's current state (location, rotation, scale) and stores it in child_object.matrix_parent_inverse. Blender applies this correction matrix to the parent's origin before calculating the child's effective global coordinates. (As it is the inverse of the original parent's matrix, it will "negate" the effect the parent had at the time of parenting, thus seemingly keeping the child in the global coordinate system.) Here is a nice official description:
Or if you prefer it mathematically (at least this is how I interpret blender's behavior):
parent.matrix_world * child.matrix_parent_inverse * child.matrix_local
(where parent.matrix_world can of course be influenced by other parents and such).
Now to get rid of the correction matrix, and to be able to place your doors at x = +-0.5 of the parent, simply select the children in question, press "alt+p" and select "Clear parent inverse" (Or in the 3D View, go to "Object"->"Parent"->"Clear parent inverse"). This will set the matrix_parent_inverse to the identity matrix and place the children in the parent's coordinate system according to the children's local coordinates. (You could get the same effect by parenting while the parent is still at the origin with no rotation and scale==1.)