Рекурсия возможна:
const getNestedValues = (arr, nestedKey, valKey) =>
Array.isArray(arr)
? arr.flatMap(n => [
n[valKey],
...getNestedValues(n[nestedKey], nestedKey, valKey),
])
: [];
const values = getNestedValues(arr, 'evolves_to', 'species');
Но не обязательна:
const getNestedValues = function(arr, nestedKey, valKey) {
const result = [];
for (const stack = this(arr); stack.length;) {
const n = stack.pop();
result.push(n[valKey]);
stack.push(...this(n[nestedKey]));
}
return result;
}.bind(x => x instanceof Array ? [...x].reverse() : []);