Si estás usando MySQL, el limit 1 funciona perfecto pero solo en consultas nativas. JPQL (el lenguaje de @Query por defecto) no lo reconoce y lanzará un error al arrancar la aplicación.
Para que funcione correctamente en tu proyecto de Spring Boot con MySQL, debes hacer dos cambios: activar nativeQuery = true y ajustar los nombres a los de tus tablas reales.
La solución definitiva (Native Query)
@Query(value = """
SELECT m.* FROM medicos m
WHERE
m.activo = true
AND
m.especialidad = :#{#especialidad.name()} <== modificado sino arroja error
AND
m.id NOT IN (
SELECT c.medico_id FROM consultas c
where c.fecha = :fecha
)
ORDER BY RAND()
LIMIT 1
""", nativeQuery = true)
Medico seleccionarMedicoAleatorioLibreEnFecha(String especialidad, LocalDateTime fecha);