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
deterministicTaskQueue.runAllTasks();
            assertTrue(future.isDone());
            assertThat(
                expectThrows(IllegalArgumentException.class, future::actionGet).getMessage(),
                allOf(containsString("Unknown NamedWriteable"), containsString("deliberately-unknown"))
            );
        } finally {
            joinValidationService.stop();
            masterTransportService.close();
            joiningNodeTransportService.close();
        }
    }
    public void testJoinValidationRejectsMismatchedClusterUUID() {
        final var deterministicTaskQueue = new DeterministicTaskQueue();
        final var mockTransport = new MockTransport();
        final var localNode = DiscoveryNodeUtils.create("node0");
        final var localClusterState = ClusterState.builder(ClusterName.DEFAULT)
            .metadata(Metadata.builder().generateClusterUuidIfNeeded().clusterUUIDCommitted(true))
            .build();
        final var transportService = mockTransport.createTransportService(
            Settings.EMPTY,
            deterministicTaskQueue.getThreadPool(),
            TransportService.NOOP_TRANSPORT_INTERCEPTOR,
            ignored -> localNode,
            null,
            Set.of()
        );
        final var dataPath = "/my/data/path";
        final var settings = Settings.builder().put(Environment.PATH_DATA_SETTING.getKey(), dataPath).build();
        new JoinValidationService(settings, transportService, () -> localClusterState, List.of());