Если я правильно всё понял то вам должно хватить:
Идея следующая. Пишем корутину-исполнитель которая из очереди задач на скачивание берёт очередное задание, загружает что требуется, а результат кладёт в другую очередь результатов. С помощью вызова
loop.create_task создаём несколько паралельно работающих корутин-исполнителей передав им как параметр очередь с задачами и очередь результатов. Пишем корутину-генератор задач, которая в соответствии с вашим алгоритмом будет наполнять очередь задачами. Как то так, к сожалению сейчас нет времени писать код.
По теме есть вот такой доклад -
Patterns for asyncio applications там описаны несколько вариантов запуска циклов, в том числе в отдельном потоке как вам надо. Дерзайте :)