i´ve feared something like that if no gap is allowed, you´re going to create many non-manifold mesh edges, because there would be more than 2 faces per mesh edge where the thickness approaches zero. This is usually a problem with STL files. Additionally it`s not that straight forward to build the 4 side surfaces.
Have you tried unwelding at angle = 0 for every of the two meshes. This way you can still select each as a single object afterwards and Join. Then use _ExtractDuplicateMeshFaces to see where the duplicate faces are, this is the area where zero volume is present. If you weld the joined result again (angle must be high), you might get it done with a lot of handwork to figure out where to build the side surfaces from polylines…it`s too time consuming.
If no gap is allowed, why not make a monster gap between both meshes, with a certain distance, eg. move the upper part up by 1000 units, then proceed as explained above to build 4 side meshes and once everything is done, turn points on and move all the upper points back by -1000 units (including the ones contained in the side meshes). The important question is, can your software deal with such a result or does it complain about the duplicates ?
You´re still have the option to remove mesh faces by area and edge length to get rid of small degenerate faces.
btw. You can get rid of the duplicated points in your pointcloud in Rhino, just explode the cloud into points, find and delete the duplicates using _SelDup and create a new cloud using _PointCloud command.