Эти операции асинхронны. Функция из onload вообще не должна возвращать никакого значения. Она выполняется, когда получен ответ от сервера, а функция toCart к этому времени давно завершится. Такие вещи надо делать через Promise/aync-await
Например, так
// первая (~ajax)
function toCart(e) {
return new Promise ((fresolve) => { // Возвращаем обещание
var req = new XMLHttpRequest();
....
req.onload = function() {
let res = this.response;
console.log(res); //
fresolve ( res); // Обещение разрешится, когда придет ответ от сервера значением res
}
})
}
// вторая
async function btnClick(e) {
...
let res = await toCart([name, size]); // ждем, когда обещание разрешится, получаем ответ
console.log(res);
}