Da man nicht die ganze Funktion sieht und Du nur vom ältesten, also einem einzigen Artikel pro Kategorie sprichst, kann ich nur vermuten das der Zähler $i nicht hochgezählt wird (also ein $i++; fehlt), weshalb $catN[0] immer überschrieben wird bis die while Schleife abgearbeitet ist. Da die Standardsortierung aber nach ID absteigend erfolgt, hast Du immer den ältesten Artikel einer Kategorie in $catN[0]
Besonders sinnig ist diese Art der Ausgabe sowieso nicht, weil sie zu viel Zeit und Ram kostet und darüber hinaus wohl aus der Not entstanden ist (fertiges Theme soll angepasst werden). Da mir aber die Zeit fehlt zu erklären wie man das richtig macht hier zwei Ansätze:
1. Um mit dem Code 1:1 weiter zu arbeiten kannst Du die Sortierung über den Action Hook pre_get_posts() ändern: https://codex.wordpress.org/Plugin_API/Act…e/pre_get_posts
2. Anstatt mit den Arrays zu arbeiten würde ich nur ein Array mit den Kategorien definieren. Entweder spezifisch, wenn nicht aller Kategorien zum Einsatz kommen sollen oder direkt über get_categories(). Im loop würde ich dann prüfen ob die erste Kategorie des jeweiligen Artikels in einer dieser Kategorien enthalten ist und den Post ausgeben. Im Anschluss, also wenn ein Match vorhanden ist, würde ich diese Kategorie aus dem Array entfernen, wodurch kein weiterer Artikel dieser Kategorie ausgegeben wird. Das ist deutlich weniger Code.