Ты запрашиваешь список ссылок на csv файлоы веб запросом, затем загружаешь по одной ссылке с сайта (самое долгое имхо) и для каждого формируешь массив (всего лишь двухмерный, т.е. твой json плоский), фильтруя записи по одному полю, плюс декодируя данные из utf-8 во внутреннее представление python (unicode) и обратно при сохранении, что
медленнее чем работать с байтами.
Т.е. что я бы сделал - либо используя асинхронщину либо (так просто проще закодить) двумя независимыми потоками или процессами, первый загружал бы данные (возможно сразу несколькими запросами, но если там один физический сайт-источник то это может не ускорить загрузку) и складывал бы их в файлы, а второй ждал бы не обработанные файлы (пока файл загружается и сохраняется на диск, его имя должно быть с пометкой о том что файл не готов, а по окончанию переименовывается), и обрабатывал бы их как поток байт (единственное место где нужно декодирование - это поиск подстроки-фильтре но помятуя про utf-8 в данном конкретном случае можно обойтись простым побайтовым поиском). Мало того, даже не надо заниматься кодированием json, просто выводи его print-ом, подставляя где надо имена полей и ковычки, нет нужды промежуточно сохранять это в массиве - прочитал csv строку и тут же ее сохранил в json, если принимающий понимает utf-8 (а сейчас все они понимают), т.е. нет нужды подменять символы на длиннющую конструкцию \uXXXX, максимум экранирование ковычек " и \ (то же самое с чтением csv),.. но прежде чем переписывать эту часть кода, достаточно хотя бы просто оптимизировать загрузку файлов, вполне возможно что 99% тормозов там