Se comunque lavori in .NET (visto che usi System.Xml) chi te lo fa fare di usare i socket nativi (o più in generale, C++)? Comunque, non c'è problema a ricevere tutto in una volta, dai tutto in pasto all'XmlTextReader passandogli come stream uno StringReader inizializzato con i dati che hai ricevuto.

Quello che piuttosto non mi è troppo chiaro è il discorso dell'UDP... in TCP l'intera questione è banale, in UDP la dimensione del pacchetto è limitata, per cui o sta tutto in ~512 byte o devi gestire in qualche maniera lo spezzettamento/la ricomposizione del payload.