В пуле хранятся соединения, скажем 10 штук. Каждый раз когда мы вызываем pool.query(), мы запрашиваем соединение. Если соединение есть - производится запрос, а потом в пуле обновляется его статус на свободный. Если все соединения уже заняты - ждём пока освободится первый попавшийся. В документации же сказано, что вы должны возвращать соединения в pool (иначе когда подойдёт лимит соединений в пуле, запросы будут ожидаться бесконечно). А pool.end() нужно вызывать когда вам больше не понадобится текущий пулл запросов, например вы его временно создали для другой БД? Пулл сам создаст соединения по необходимости, конечно он не будет выходить за лимиты, иначе бы мы тратили все ресурсы на создание соединений.