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/main/java/org/elasticsearch/action/support/broadcast/node/TransportBroadcastByNodeAction.java
@Override
        public void messageReceived(final NodeRequest request, TransportChannel channel, Task task) throws Exception {
            executeAsDataNode(
                task,
                request.getIndicesLevelRequest(),
                request.getShards(),
                request.getNodeId(),
                new ChannelActionListener<>(channel)
            );
        }
    }
    private void executeAsDataNode(
        Task task,
        Request request,
        List<ShardRouting> shards,
        String nodeId,
        ActionListener<NodeResponse> listener
    ) {
        logger.trace("[{}] executing operation on [{}] shards", actionName, shards.size());
        new CancellableFanOut<ShardRouting, ShardOperationResult, NodeResponse>() {
            final ArrayList<ShardOperationResult> results = new ArrayList<>(shards.size());
            final ArrayList<BroadcastShardOperationFailedException> exceptions = new ArrayList<>(0);
            @Override
            protected void sendItemRequest(ShardRouting shardRouting, ActionListener<ShardOperationResult> listener) {
                logger.trace(() -> format("[%s] executing operation for shard [%s]", actionName, shardRouting.shortSummary()));
                ActionRunnable.wrap(listener, l -> shardOperation(request, shardRouting, task, l)).run();
            }
            @Override
            protected void onItemResponse(ShardRouting shardRouting, ShardOperationResult shardOperationResult) {
                synchronized (results) {