подключают в основном в конце body, потому что важно сохранить последовательность загрузки и выполнения скриптов, например jquery, а потом какой-нибудь common.js, который юзает jquery.
+ в таком случае загрузка скриптов начнется уже в самом конце, когда пропарсился html.
Т.е. допустим у вас в head есть скрипт, который весит ~10мб, но он defer и не критикал (тобишь его можно потом догрузить лениво), в таком случае он начнет сразу грузится, а парсинг хтмл продолжится дальше, далее у вас в хтмл встречаются другие картинки, медиа-файлы и т.д. - но если у вас слабое соединение, то весь канал будет съедаться этим скриптом.
но в целом, если у вас стоит аттрибут - defer или async, то в принципе не важно куда вы подключите ваш script.
вот схемка разных вариантов подключения скрипта:
https://hospodarets.com/img/blog/14828583238612140...