Der TCP-Header gibt einen Quell- und einen Zielport an. Beim Verbindungsaufbau vom Heim-PC zum Internetserver wird ein zufälliger Port größer 1024 gewählt und in das Feld "Quellport" eingetragen. Erreicht das Paket den NAT-Router, ersetzt dieser die Quell-IP durch seine eigene (WAN-)IP und optional den Quellport durch einen selbst gewählten (das ist NAT). Weiterhin wird die Verbindung in eine Tabelle eingetragen und der soeben vergebene
Quellport für den Empfang der Antwort
geöffnet (das ist SPI). Nach der Verarbeitung durch den Server wird die Antwort an die Adresse und den Port geschickt, die der NAT-Router eingetragen hat. Dieser empfängt zunächst nur ein unbekanntes Paket. Er schaut in seiner Tabelle nach, ob ein Eintrag zu dem empfangenen Paket passt. Wenn nicht, wird das Paket verworfen. Wenn ja, wird das Paket weitergeleitet. Dabei wird die Ziel-IP, die ja noch die WAN-IP des Routers ist, mit der lokalen Adresse des ursprünglich anfragenden Rechners ersetzt. Selbiges geschieht mit dem Port, falls der Router diesen verändert hatte. Der Antwort-empfangs-Port bleibt offen, solange die Verbindung zum Server besteht, um keine Ressourcen zu verschwenden. Wird die verbindung getrennt, schließt der Router den Port und löscht den Tabelleneintrag. Für den Heim-PC und den Server ist das Verfahren transparent - beide bemerken nichts von der Paketänderung.
Um auf die ursprüngliche Frage (@Kangaroo) zurückzukommen: Der Router muss, für die Dauer der Verbindung, einen Port öffnen, um Antworten zu empfangen. Da alle (laut Tabelle) unpassenden Pakete jedoch verworfen werden, ist das nicht weiter schlimm. Würde der Port geschlossen bleiben, käme nie eine verbindung zustande. Ein Problem taucht in die andere Richtung auf, nämlich wenn der Server zu Hause steht:
Der NAT-Router verwirft zunächst alle Anfragen. Damit ist der Heim-Server nicht erreichbar. Soll eine Verbindung aus dem Internet zu ihm aufgebaut werden, muss der Router von vornherein alle Verbindungen auf einem bestimmten offenen Port ohne weitere Prüfung durchlassen. Der NAT-Mechanismus funktioniert wie oben, nur umgekehrt. Dummerweise greift SPI in diesem Fall nicht, denn der Port ist ja schon offen. die tabelleneinträge dienen dann nur noch der Zuordnung der Verbindungen, aber nicht mehr als Schutz.
Die Frage des Threaderstellers ist dagegen mit einem uneingeschränkten Nein zu beantworten, weil sich "TCP" und "keine geöffneten Ports" von vornherein ausschließen (für die Akademiker: ein klassisches Oxymoron

). TCP bietet zuverlässige verbindungsorientierte Kommunikation über nicht-zuverlässige Kanäle, was Empfangsbestätigungen (Antworten) impliziert. Dazu muss der Sender Empfangsbestätigungen annehmen können, z.B. durch einen geöffenten Port.
PS: Die Adressen stehen natürlich nicht im TCP-Header, sondern im IP-Header. Ich habe die Kombination allgemein mit "Paket" umschrieben.