В первом случае 
h1 в документе появился раньше, чем был вызван 
console.log, во втором позже. Т.е. на момент вызова второго кода никакого 
h1 ещё не существует. Javascript выполняется последовательно сразу как только получен, и если тег 
script выше в тексте чем 
h1, то код из 
script выполнится уже тогда, когда 
h1 ещё летит к вам по сети.
Соответственно надо либо дожидаться загрузки страницы (события 
load или 
DOMContentLoaded) или ставить тег 
script в самом низу.
Если же ваш 
h1 и вовсе добавляется динамически, то, соответственно, и изменения надо вносить в ту часть кода, что за это действие отвечает.
P.S. В консоли видны все значения потому, что 
getElementsByTagName (в отличение от например 
querySelectorAll) возвращает динамическую коллекцию, которая автоматически актуализируется, а когда вы смотрите в консоль страница уже полностью прогрузилась. 
С этим, кстати, надо быть острожным, т.к. консоль сохраняет лишь примитивные значения (текст\число\булево), копии же объектов не делает оставляя только ссылку, а потому при логировании объекта вы увидите финальные значения на конец исполнения, а не значения на момент вызова 
console.log.
P.P.S. 
table[0].insertBefore(myNewElement, table.childNodes);
 это не верно, т.к.: 
var insertedElement = parentElement.insertBefore(newElement, referenceElement);
//    insertedElement Вставленный элемент.
//    parentElement Родитель для нового элемента.
//    newElement Элемент для вставки.
//    referenceElement Элемент, перед которым будет вставлен newElement.
 Как можно видеть 
referenceElement - должен быть именно элементом, а не ещё одной коллекцией(
childNodes).
В вашем случае всё работает лишь из-за второй ошибки

: 
table.childNodes у вас 
undefined(т.е. не имеет значения), т.к. 
table - это коллекция(т.е. подобие массива), у неё нет детей, дети бывают только у элементов. А вызов 
insertBefore с 
referenceElement, значение которого можно привести к 
null, равносилен вызову 
appendChild, т.е. простому добавление insertedElement в конец 
parentElement.