Wenn du das innerHTML eines Elementes setzt, parst der Browser das und setzt es um.
Dabei geht er sehr fehlertollerant vor. Aus deinem
document.getElementById('div1').innerHTML += "<table border='0'>";
macht er vermutlich
"<table border='0'></table>"
Anders kann er (außer die Tabelle wegzulassen) ja auch nicht vorgehen, wie soll er wissen, das du im nächsten Schritt Zeilen und Spalten einfügen willst? Er müsste ja auf irgendein Ende warten, ehe er parst.
Du musst also erst den kompletten String zusammenbasteln und diesen dann zuweisen (die ganze Tabelle in einem Rutsch).
Alles klar. Danke!