必要なパッケージをインストールする

npm install superagent --save
npm install async --save

実装

const client = require('superagent');
const async = require('async');
const fs = require('fs');
const path = require('path');

/**
 * 
 * @param string url ダウンロードurl
 * @param string save_to 保存先
 * @param function done コールバック
 */
function download(url, save_to, done) {
    async.waterfall([
        // ダウンロード
        (done) => client.get(url).responseType('blob').end(done),
        // res.bodyがblobなので、ファイル内容として書き込む
        (res, done) => fs.writeFile(save_to, res.body, done)
    ], done);
}

/**
 * main関数
 */
function main() {
    // ダウンロード対象
    const url = 'http://www.gravatar.com/avatar/bf6182db3f2bb0a39d5b19196d8d447b?s=480';

    // 保存先
    const save = path.join(__dirname, 'avatar.png');

    // ダウンロード
    download(url, save, (err) => {
        if (err) return console.error(err);
        console.log('downloaded', url);
    });
}

// main実行
main();

実装したdownload関数は、async.parallelで非同期でバッチダウンロードができる。例えば:

// ダウンロード画像の配列
const images = [
    'https://hoge.com/img1.png',
    'https://hoge.com/img2.png',
    'https://hoge.com/img3.png',
    ...
];
async.parallel(
    images.map(img => done => {
        const save_as = path.join(__dirname, path.basename(img));
        download(img, save_as, err => done(null, err || save_as));
    }), (err, imgs) => {
        // err = null
        // imgsはダウンロードした画像の保存パスかエラーの配列
    }
);