You could use:
c := Stucontact.Contact.Id; Stucontact.Eportal = 'Y' And ListLeft(Sort(Rempty(ListMerge(Stucontact.Student. Id, Stucontact.Student.Personal.Family.Students(ListCo ntains(Contacts(Eportal = 'Y', Contact.Id), c), Id)))), 1) = Stucontact.Student.Id
as the contents of your filter, which should only return a single student-contact link. It'll only work so long as your siblings are correctly linked and the contacts aren't duplicated and returns the first student Id alphabetically, but I assume the body of the letter is only referring to the contact itself and not the students.
I realise this is a little after the fact, but just thought I'd point it out in case it's useful to you in the future. Incidentally, you should consider requesting a login to the Serco forums, they're pretty active and you'll often find people willing to lend a hand there. I tend to be far more active over there than here, which is why I didn't spot this thread until now.