Надо просто понимать, что asyncio - это не многопоточность (хотя и указан этот тэг в вопросе). Это один процесс, который выполняет только одну задачу в каждый момент времени. И переключает он задачи только тогда, когда какая-то из них запускает операцию ввода-вывода или что-то ещё подобное (например, asyncio.sleep).
Например, если мы сделаем запрос к базе данных (с асинхронной библиотекой работы с этой базой обязательно! например, вместо sqlite3 используем aiosqlite), то пока база данных думает над ответом, скрипт может переключиться к какой-то другой ожидающей выполнения задаче. Когда база ответит, то цикл событий (event loop) вернёт управление задаче, которая сделала запрос к базе.
В приведённом примере кода есть два места, которые могут быть узкими:
1. Функция logic может быть и объявлена async, но если она делает чисто вычислительные операции без ввода-вывода (асинхронного), то в процессе её работы никогда не будет переключения на цикл события и, как следствие, не будут выполняться другие задачи. Даже если их собственный ввод-вывод уже совершился и задачи могут быть продолжены.
2. Сама работа с базой может также блокировать цикл событий.
Например, пусть logic работает 10 секунд, а dbase.search_in_queue - 5 секунд, и обе они содержат только синхронный код. Тогда пока выполняется dbase.search_in_queue свои 5 секунд, не будет выполняться logic, и наоборот.