Three interrelated issues here:

- [ ] `TransportBroadcastByNodeAction` derivatives are typically executed via `NodeClient` which bypasses the `TransportService` and therefore does not respect (or even know about) the `executor` parameter which would fork. This means that the coordination work, including grouping all the shards by node, happens on the calling thread. When executed from the REST layer, that's a transport worker. This is #97916, but until that's fixed we need a workaround.

- [ ] The node-level responses are deserialised and processed on the receiving transport worker too.

- [ ] Several of these actions use `SAME` for their executor, bypassing the forking that _does_ exist today.

Relates #77466 
server/src/test/java/org/elasticsearch/action/support/broadcast/node/TransportBroadcastByNodeActionTests.java
private final Map<ShardRouting, Object> shards = new HashMap<>();
        TestTransportBroadcastByNodeAction(String actionName) {
            super(
                actionName,
                clusterService,
                transportService,
                new ActionFilters(Set.of()),
                new MyResolver(),
                Request::new,
                ThreadPool.Names.SAME
            );
        }
        @Override
        protected ShardResult readShardResult(StreamInput in) {
            return new ShardResult();
        }
        @Override
        protected ResponseFactory<Response, ShardResult> getResponseFactory(Request request, ClusterState clusterState) {
            return (totalShards, successfulShards, failedShards, emptyResults, shardFailures) -> new Response(
                totalShards,
                successfulShards,
                failedShards,
                shardFailures
            );
        }
        @Override
        protected Request readRequestFrom(StreamInput in) throws IOException {
            return new Request(in);
        }