Как маршрутизатор определяет на какой из устройств в локалке отправить запрос?
Какое либо удаленное устройство через интернет отправляет запрос на открытие TCP соединения по моему IP адресу и нужному (5000) порту. Как маршрутизатор, приняв пакет с данным запросом понимает, на какое именно устройство из моих двух в локальной сети этот пакет дальше отправить?
Никак, если специально не сконфигурили (это и называется "проброс портов").
Ок, еще UPnP есть.
Маршрутизатор про порты ничего знать не хочет, он просто держит в памяти табличку с соответствием мак-адресов, айпишников и портов (физических), поэтому знает, куда отправлять пакеты.

Когда вы начинаете прослушивать порт - ОС просто перестаёт отвергать пакеты с этим портом назначения, а начинает передавать их приложению. Можно не слушая порт (например, настроив iptables в линуксе) что-то делать с этими пакетами - например, передавать на другой порт или даже отправлять куда-то вовне.