Es un problema de decisión de selección de índice que realiza el parser.
Cuando usas DATE() o STR_TO_DATE, en realidad estás convirtiendo algo que tiene el mismo formato de la clave de índice, por algo diferente. En ese caso no detecta igualdad y lo descarta (Oracle hace algo parecido en ciertos casos).
En cambio, cuando realizas la consulta así:
antes de verificar si el indice es aplicable tiene que realizar la conversión y en ese contexto, el dato es del mimo tipo y longitud... y el indice aplica.
Para estar más seguros, habría que probar qué pasa al usar:
Lo que sí es seguro es que al usar DATE_FORMAT() sobre el campo indexado, el índice se descarte, precisamente porque se pierde la relación entre el dato y el índice.