Ok, you managed to confuse me for a while, but the behavior is actually correct...albeit confusing. The "problem" is: The translation of the child gets rotated. It has to, because otherwise it would be impossible to keep the three objects in place when rotating the parent. Would it be different, this
target.translate( 0, -1.2f, 0 );
child.translate( 0, -3, 0 );
wouldn't work when the parent rotates, because the translations would have to change constantly to keep the objects in place. In your case, this either means that you have to use a static translation (0,1,0) and (0,-1,0) and it will work, or, if that's not an option because the actual case is more complicated, revert the rotation like so (works only in this simple way, if the world transformation matrix contains no translations...if it does, you have to set them to 0 before using Matrix.set(...)) :
direction.matMul(parent.getWorldTransformation().invert3x3());