Почему setTimeout() срабатывает без второго аргумента?
у меня все сразу работает. Кроме того, если её запустить в консоли браузера хром, то кроме фразы 'hello' выводится какая-то цифра.
setTimeout() также как и setInterval() возвращают числовой идентификатор счетчика, чтоб можно было по нему отменить через clearTimeout(timeoutId)/clearInterval(intervalId)
"Какая-то цифра" - это идентификатор таймаута, которую функция возвращает, может быть в дальнейшем использован для передачи в  функцию clearTimeout (отменяет таймаут).
А второй аргумент - задержка в милисекундах, если не задано, то используется 0, но в реальности это не значит, что функция будет мгновенно выполнена, может пройти 16 мс или даже больше (в зависимости от нагруженности браузера).