Ya pasé por algo parecido cuando intentaba procesar archivos grandes de una vez y me percaté de que el problema no era solo memoria - era el hecho de estar cargando todo de una vez en RAM. Con un CSV de 500MB, si intentas leer el archivo entero y después procesarlo, te vas a quedar sin memoria rapidito. La solución es usar streams en lugar de cargar todo a memoria. En Node.js tienes el módulo `fs.createReadStream()` que te permite leer el archivo a trocitos. Si estás con librerías tipo `csv-parser`, consigues encadenar streams para procesar línea a línea sin sobrecargar la RAM.
Otra cosa que cambió para mí fue percatarme de que incluso con streams, si tu lógica de procesamiento es lenta (tipo operaciones síncronas en el loop, queries a la BD sin batch), vas a crear un cuello de botella. Cuando el stream proporciona datos más rápido de lo que conseguís procesar, la memoria se acumula igual. Usa `pause()` y `resume()` para controlar el flujo, o implementa back-pressure adecuadamente. Si estás haciendo queries a la base de datos para cada línea, agrúpalas en batch - tipo, agrupa 1000 líneas y haz una sola operación en lugar de 1000 separadas.
¿Cuál es más o menos la operación que estás haciendo con los datos del CSV? ¿Y estás guardando los resultados en algún lado (archivo, base de datos) o solo procesando y devolviendo por la API? La respuesta ayuda porque el problema puede estar también en la forma en que estás enviando la respuesta al cliente.