Te doy mi punto de vista sobre tu pregunta, que es bastante opinable, por lo tanto es una respuesta más subjetiva que otra cosa.
Yo creo que usar las funciones incorporadas no tiene nada de malo. Al contrario, a mi modo de ver, cuando usas tu propio código para producir comportamientos que ya están incorporados en el propio lenguaje con funciones como pop() o unshift() estás demostrando que tienes un conocimiento deficiente del lenguaje. Es decir, primero es ver si Javascript te ofrece de manera nativa una solución y si no es así, hacerlo por tu cuenta.
Otra cosa es que muchas de las funcionalidades como el manejo de arrarys y objetos en Javascript han sido mejoradas en ECMAScript 2015 (ES6) y esa parte sí la deberías de conocer para demostrar un manejo adecuado del lenguaje. Hay maneras de extraer datos de los objetos o arrays en variables, o insertar datos a objetos o arrays, y cosas similares que ni siquiera necesitas usar funciones incorporadas, que el propio lenguaje te ofrece por medio de operadores como los de destructuración o propagación. Otro punto interesante es todo lo que te ofrecen los template strings que usarlos demuestras que estás enterado de las capacidades más nuevas, lo que indica dominio de Javascript. O las funciones flecha... hay muchas cosas.
Lo que yo no veo que demuestre conocimiento del lenguaje es usar librerías como lodash para cosas que ya te ofrece ES6. Creo que, sobre todo en el desarrollo frontend es un peso innecesario en tus programas, en NodeJS quizás sería menos mal visto.
**Cuando hablas sobre "soluciones optimizadas": ** Por supuesto que tenemos que construir algoritmos que tengan la complejidad menor posible. Pero ese es un conocimiento más de programación en general que sobre un lenguaje sobre Javascript. El que te dijo que Javascript no tiene problemas de rendimiento en realidad te contó una verdad muy sesgada, ya que como todo lenguaje, si lo usas incorrectamente, consigues aplicaciones lentas. Además, Javascript lo que lleva bien es atender gran cantidad de solicitudes siempre que impliquen ejecución de código asíncrono, ya que el código bloquetante hace que no pueda atender otros asuntos en su arquitectura de mono-proceso. Javascript es un estupendo lenguaje, pero no existen balas de plata y para cálculos complejos, por ejemplo, existen mejores lenguajes que son capaces de atender mejor las solicutudes.
En ese punto anterior, también hay que saber usar muy bien el comportamiento asíncrono de Javascript. Ya que es la manera de hacer programas que aprovechen las condiciones del lenguaje. Eso implica conocer y usar bien las promesas, así como async await.
En definitiva, la complejidad es importante, en Javascript también, por supuesto. Y saber qué tipo de aplicaciones se desarrollan usando Javascript, porque no todas son adecuadas (a nivel de servidor o node.js, porque de momento en el navegador estamos obligados a usar Javascript). Además de desarrollarlas de manera consciente para aprovechar las bondades del lenguaje.