El INNER JOIn te asegura que el bloque de datos a filtrar luego con WHERE cumple seguro con la restricción dada en el ON. Esa restricción además le asegura un prefiltrado eficiente y mucho más potente que lo que puedes lograr usando el WHERE.
Pero la eficiencia u optimización de una consulta son se cierra en ese punto. La selectividad de una relación entre dos tablas es crítica muchas veces.
Por ejemplo, si haces un INNER JOIN productos y ventas, obtendrás los productos efectivamente vendidos... pero eso en u supermercado puede representa millones de registros, mientras que si lo que quieres es un bloque menor, más restringido, puede requerirse, por ejemplo una subconsulta que genere una tabla derivada.
Por ejemplo:
Te este modo, con esa subconsulta se puede restringir con qué datos vas a trabajar de una de las tablas, haciendo más eficiente la consulta.
Otra de las posibilidades es crear índices sobre determinados conjuntos de campos. Eso si, hay que ser cuidadoso con estos índices porque si tienes muchos INSERT/UPDATE, el exceso de índices puede afectar la performance de esos.