Why do front end dashboard/profile views create a duplicate Civi contact?
So a careful look at the civicrm_uf_match table revealed that some of the Joomla user IDs in the table were not the current user IDs of those users. Clearly the original Joomla users had been deleted and recreated with new IDs but the civicrm_uf-match table had not kept in sync with the changes. I'm not sure why - probably some past database problem that I've forgotten.  In Joomla installations, Civi only checks Joomla users for a linked Civi contact record when they interact with Civi as documented here.  So the matching of the Joomla user to the Civi contact was failing.  I manually changed the records in civicrm_uf_match to correct the Joomla user ID and all is now OK.