If you use deviation checking, you can see that the edges on the small cylindrical faces have a very small angular misalignment. It is too small to bother the sew feature, but may be giving the join face problems. I tried hiding one half of the small cylinder (body 7) then mirrored the circular edge of body 6 and extruded a new sheet body - these worked with the sew and join commands.
The deviation is really very very small. It's a surprise for me that Join Face is so sensitive!
Join Face has a primitive dialog box and does not allow setting tolerance. I wonder whether there is a full functional version for the command that is far from trivial.
I can't understand why Optimize Curve forces the removal of parameters and limits its use very much.
I'm not sure if that small deviation is the true reason why the join face is not working, it is just my best guess right now.
"I can't understand why Optimize Curve forces the removal of parameters and limits its use very much."
The optimize face function is very handy when working on imported geometry. Similar to your example file, the imported geometry won't have parameters to start with, so no loss there.
But your input geometry is non-associative (assume imported from Catia as that is how holes are done), so why is it important to create a feature? Repairing converted geometry would be the task to do before doing any feature based modifications on the geometry.