Как создать несколько записей в таблице с помощью doctrine одним запросом?
Никак.
Можно конечно написать "сырой" sql запрос в обход doctrine, или даже сделать LOAD DATA INFILE если данных действительно много. Но это уже фичи, которые по разному реализованы в разных СУБД и доктрина таким не занимается.
Это не слишком много запросов к базе. Это то, как надо работать с базой.insert into tablename (id,blabla) values(1,'werwer'),(2,'wqewqe'),(3,'qwewe');
Такой код не нужен. Если таких данных будет много вы просто по памяти вылетите.
У вас $em->flush(); за циклом, все верно!