To see what happens when joining surfaces let's take a look at this exaggerated example. We have two surfaces that have no edges that match up, but we can force to join them with the JoinEdge command. (You can download the example file)
When we do this, Rhino will of course ask if we are really sure about this action, since the edges are way out of tolerance in order to join them.
Still we choose yes. Now it becomes apparent what is happening. The mesh is now closed, we can not see through the gap that was originally there. But the wireframe of the two surfaces shows something more. One of the edges has been transformed to the edge it was joined to.
Now you might think that after exploding, the edge is put back into its original position. But this is not the case as can be seen in the following image. For clarity, the surfaces have been moved apart.
You can probably guess now what happens if you start building new geometry based on these exploded surfaces. As you can see for yourself, you can still snap to the original edge end, but to the transformed edge end as well. Of course it is not difficult in this case to pick the right end, but in normal file, you will not notice which end you select.
Fortunately Rhino has a command to clean up these transformed edges with the command RebuildEdges. This will rebuild edge to match the original edge within the tolerance specified in the command.