Hola Hquinn.
Un par de cositas, que una vez explicadas, verás que se puede hacer más fácil.
Primero, indicar que un String viene a ser lo mismo que un vector (un array de 1 dimensión).
Es decir, puedes acceder a cada letra del String sin tener que usar el método .subString() (este es útil cuando queremos seleccionar más de un carácter del String) porque cada letra está guardada como si fuera un elemento individual con un número de indice que le identifica.
Aquí lo has hecho bien, porque de hecho el enunciado del ejercicio te pide que uses el subString() para que te familiarices con este método.
Pero esto te lo comento para que sepas que en realidad, no es necesario usar dicho método cuando queremos acceder a letras de manera individual.
Si será útil cuando queremos seleccionar varias letras seguidas juntas de una cadena.
Para acceder a cada letra, basta con indicar el nombre del String y junto a el, entre corchetes, el número de indice de cada letra.
Por ejemplo: entradaTeclado[0]
Con eso referimos a la primera letra del String, que están numeradas desde el 0 hasta la (longitud del String - 1).
Es decir, si un String tiene 5 letras, sus indices serán: 0, 1, 2, 3 y 4.
Entonces, en el bucle, puedes usar directamente la variable i para sacar cada letra del String por pantalla, que además ya la tienes establecida para que empiece desde 0 y vaya aumentando mientras no alcance la longitud del String, por lo que no tienes ni que sumarle ni restarle. Puedes usar la i tal cual:
for(int i=0;i<cuantasLetras;i++){
System.out.println("Letra "+(i+1)+": " + entradaTeclado[i]);
Pero insisto, tú lo has hecho bien usando el método subString() porque así te lo pide el ejercicio.
Segundo, la comprobación que haces con el if dentro del bucle for, es innecesaria porque el bucle for ya tiene una condición de salida, ya le hemos dicho que se ejecute mientras "i sea menor que cuantasLetras".
En cuanto i deje de ser menor, el bucle for dejará de ejecutarse y no hay riesgo de que intentemos acceder a una letra que no existe.
Puedes quitar el if y verás que el programa funciona igual.
En ejercicios más complejos, si puede interesar usar el break para que en según que condicion, interrumpir el bucle antes de que alcance la condición de salida principal.
Otro detalle, menos importante.
Guardar la longitud del String en la variable cuantasLetras para usarla como condición del bucle for, es correctísimo y no supone ningún problema.
Sin embargo, si quisieras, puedes ahorrarte esa variable y escribir el bucle for directamente usando el metodo .length() de este modo:
for(int i=0; i < (entradaTeclado.length() - 1); i++){
System.out.println("Letra "+(i+1)+": " + entradaTeclado[i]);
El resultado, como digo, es el mismo. La ventaja es que te ahorras declarar una nueva variable.
En algunos casos, puede que necesites emplear la longitud del String para más cosas a parte de como condición de un bucle, entonces si vale la pena crear una variable para guardar este dato y ahorrarte escribir varias veces el método .length() en el mismo programa.
Por lo demás, todo parece estar bien.