Я сталкивался с подобными проблемами группировки. Обычно я заканчиваю тем, что подключаю слияние или обновление к некоторому шагу обработки seq:
(apply merge-with list (map (partial apply hash-map) data))
Вы получаете карту, но это всего лишь пара пар ключ-значение:
user> (apply merge-with list (map (partial apply hash-map) data))
{:morning (:pear :mango), :evening (:mango :pear)}
user> (seq *1)
([:morning (:pear :mango)] [:evening (:mango :pear)])
Однако это решение получает то, что вы хотите, только если каждая клавиша появляется дважды. Это может быть лучше:
(reduce (fn [map [x y]] (update-in map [x] #(cons y %))) {} data)
Оба они чувствуют себя "более функциональными", но также чувствуют себя немного запутанными. Не спешите отклонять свое решение, оно простое для понимания и достаточно функциональное.