Дело в том что локальная переменная $db, которую Вы возвращаете из функции после вызова $prepare уничтожается, соответственно закрывается соединение с MySQL.
Во втором примере Вы продлеваете время жизни присвоив результат DB::init и таким образом у Вас соединение поддерживается до тех пор пока жива $db.
Это «простое объяснение», для более глубокого понимания читать о счетчиках ссылок, механизмах сборки мусора в PHP
php.net/manual/en/features.gc.refcounting-basics.php