Оказалось, что всё-таки TcpTimedWaitDelay рулит. И, похоже, новое значение вступает в силу после перезапуска системы. Изначально TcpTimedWaitDelay равно 30 секунд, я исправил на 5. Без перезагрузки оказалось, что через 30 секунд после дисконнекта, повторный коннект прошёл таки!
Но вылезло ещё кое-что. Если после коннекта нет обмена, то сервер (моя железка) сама разрывает соединение по таймауту (я поставил 2 минуты). При этом в клиенте возникает исключение "Удалённый хост принудительно разорвал существующее подключение", а при попытке коннекта — исключение "Сделан запрос на подключение для уже подключённого сокета". Что странно, ведь система знает, что коннект разорван. Хотя смысл слова "подключённого" может уже и другой в этой ситуации. Однако после принудительного вызова дисконнекта у клиента, повторный коннект сработал!
Но всё-таки хотелось бы программно "убивать" сокет, чтобы можно было в любой момент без большой задержки реализовывать короткую "сессию" типа коннект-обмен-дисконект. Потому как другой вариант — гонять туфту по сети ради поддержания коннекта, не выглядит привлекательным.