It took me ages to figure out what was going wrong.
My iMessage conversations with the kids were split into two threads, even though Contacts.app only knew of one person.
Turns out the problem was the old me.com and iCloud.com split.
Years ago Apple migrated its cloud services from an email of me.com to one of iCloud.com. They implemented a redirect, but I’ve come to suspect that the “real” address is still me.com. Or rather that on some Apple backends it’s me.com and some it’s iCloud.com. Turns out the same messiness applies to Message.app and iMessage.
iMessage/Message.app doesn’t know about this redirection. It doesn’t know iCloud.com and me.com are synonyms. So a thread that references firstname.lastname@example.org is separate from one that references email@example.com.
The workaround is to put both the me.com and iCloud.com addresses into the contact. It’s a pain of course, you don’t want to do this for every person you know. I’m doing it now for the kids.
I suspect this is a very hard bug to fix.