Il problema deriva dal fatto che, quando imposti l'HTML attraverso la proprietà DocumentText, il browser reagisce "dimenticando" il contenuto del documento attuale, impostando un URL vuoto (about:blank) e impostando come documento attivo quello specificato come parametro alla proprietà.

Una volta impostato il markup HTML, la navigazione del browser avviene in modo asincrono così come il parsing del documento stesso, quindi se cerchi di navigare da subito al suo interno, otterrai solo eccezioni e riferimenti null.

Devi intercettare l'evento DocumentCompleted per essere notificato al momento in cui il browser ha finito il parsing del documento HTML.

Questo principio di funzionamento deriva dal fatto che l'HTML generalmente viene scaricato dalla rete, quindi il documento viene interpretato poco alla volta fino a quando non è stato scaricato tutto.

Se provi l'approccio mostrato nel codice che segue, ottenuto modificando il tuo, vedrai che tutto funziona.

codice:
private void DumpHeaderTable(object sender, WebBrowserDocumentCompletedEventArgs e)
{
	var webBrowser = (WebBrowser)sender;
	var headerTable = webBrowser.Document.GetElementById("header");
	headerTable.Dump();
}

void Main()
{
	string HTML = "      <table id='header'  style='width:100%;font-size:10px;' > ...   </table>  ";

	var w = new WebBrowser();
	w.DocumentCompleted += DumpHeaderTable;	
	w.DocumentText = HTML;	
}
Ciao!