Ясно. Как это реализовать, кажется, писал Антон Долганин у себя в блоге. А может не он или не там, давно это было. Поищите, должно найтись. Сразу предупреждаю, что нормально без костылей этого не сделать.
Судя по описанию, которое я привёл в ответе, добиться такого поведения для генерируемых скриптов невозможно. Единственное, что можно сделать - это сохранить порядок загрузки, если он важен.
Чтобы отложить выполнение скрипта, похоже, нужно загружать его по событию DOMContentLoaded. Это не идеально с точки зрения скорости инициализации страницы, зато можно гарантировать, что скрипт не повлияет на скорость загрузки страницы.
То есть вам из этих десяти строчек кода непонятна вообще ни одна? И ни в одной из этих строк вы не видите знакомых конструкций? Или у вас всё-таки проблемы с какой-то определённой частью?
Я не могу пройти мимо, потому что я модерирую данный ресурс. Есть два варианта развития событий: вы задаёте конкретный вопрос (в чём у вас затруднения, что непонятно, что вы пробовали, что не получается), на который можно дать конкретный ответ или я удаляю этот вопрос.
Вы забыли написать непосредственно свой вопрос. "Помогите разобраться", "хочется понять", "капец трудно" - это не вопросы, это, простите, нытьё. Нытью здесь не место.
Давайте разберёмся с задачей и вашим пониманием работы async и defer. Создайте демо на jsfiddle с описанием ожидаемого поведения и чем оно отличается от реального.
Мне кажется, стоит отметить, что кеширование - это большая боль для разработчика, на самом деле. И "не надо кешировать" - это именно с этой точки зрения. Любой кеш усложняет приложение в разы, потому что его нужно инвалидировать, обрабатывать ошибки и т.п. Но часто без него не обойтись, это факт.