https://github.com/elastic/elasticsearch/pull/97304 removes several places that might do an expensive rebuild of the cluster state via `getStateForMasterService`. There's one other call we should be able to remove, in `JoinValidationService`, but it's a little tricky since we rely on seeing the last-accepted state for the cluster UUID validation, and it's not obviously ok to expose the last-accepted state without the no-master block.

This is a fairly minor issue because we do not do this join validation during elections, only if we're the elected master, and in that case `getStateForMasterService` is cheap. But that's not guaranteed, and we should strengthen this to avoid the that expensive step whenever possible.
server/src/test/java/org/elasticsearch/cluster/coordination/JoinValidationServiceTests.java
transportService.start();
        transportService.acceptIncomingRequests();
        final var otherClusterState = ClusterState.builder(ClusterName.DEFAULT)
            .metadata(Metadata.builder().generateClusterUuidIfNeeded())
            .build();
        final var future = new PlainActionFuture<TransportResponse.Empty>();
        transportService.sendRequest(
            localNode,
            JoinValidationService.JOIN_VALIDATE_ACTION_NAME,
            new ValidateJoinRequest(otherClusterState),
            new ActionListenerResponseHandler<>(future, in -> TransportResponse.Empty.INSTANCE)
        );
        deterministicTaskQueue.runAllTasks();
        assertThat(
            expectThrows(CoordinationStateRejectedException.class, future::actionGet).getMessage(),
            allOf(
                containsString("This node previously joined a cluster with UUID"),
                containsString("and is now trying to join a different cluster"),
                containsString(localClusterState.metadata().clusterUUID()),
                containsString(otherClusterState.metadata().clusterUUID()),
                containsString("data path [" + dataPath + "]")
            )
        );
    }
    public void testJoinValidationRunsJoinValidators() {
        final var deterministicTaskQueue = new DeterministicTaskQueue();
        final var mockTransport = new MockTransport();
        final var localNode = DiscoveryNodeUtils.create("node0");
        final var localClusterState = ClusterState.builder(ClusterName.DEFAULT).build();
        final var transportService = mockTransport.createTransportService(