Yep, this might be confusing. First,
rs.JoinMeshes(objcts) without a second argument will make a joined copy and leave the originals. So I think you want
new_meshes=rs.JoinMeshes(objcts,True) - which will delete the originals.
And, rs.JoinMeshes() also puts the new joined mesh on the current layer. If that happens to be further down the list than where you are in the script, those will also get added and joined to the other meshes on that layer - resulting in a possible mess.
So, something like this, which throws the new joined mesh back onto the original layer is maybe better:
import rhinoscriptsyntax as rs
layerID = rs.LayerNames()
for layerObj in layerID:
objcts = [obj for obj in rs.ObjectsByLayer(layerObj) if rs.ObjectType(obj)==filt]
if objcts and len(objcts)>1: