guzzleのasyncによる非同期リクエストは並列処理になって処理順がバラバラになります。なってほしいです。
しかしどうも書いていると直列っぽく動作しているので、サンプルで確認。並列になっています。

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client;

$promises = [];
for ($i = 0; $i < 5; $i++) {
    $promises[] = $client->requestAsync(
        'GET',
        'https://google.co.jp/',
        [ 'on_stats' => function ($stats) { echo $stats->getTransferTime() . "\n"; } ]
    )->then(
        function ($res) use($i) {
            echo "ok $i\n";
        },
        function ($res) use($i) {
            echo "ng $i\n";
        }
    );
}

$results = \GuzzleHttp\Promise\settle($promises)->wait();

実行結果。

$ time php test1.php 
0.120568
0.127015
0.136196
0.138116
0.164962
0.139618
ok 1
0.134759
ok 3
0.13847
ok 2
0.123677
ok 4
0.134104
ok 0

real    0m0.391s
user    0m0.142s
sys 0m0.040s

ここまでは良し。
ちょっともしかしてと思って、Clientを都度生成してしまったら……

<?php
require 'vendor/autoload.php';

$promises = [];
for ($i = 0; $i < 5; $i++) {
    $client = new \GuzzleHttp\Client;  // ←Clientを都度生成してしまうと……

    $promises[] = $client->requestAsync(
        'GET',
        'https://google.co.jp/',
        [ 'on_stats' => function ($stats) { echo $stats->getTransferTime() . "\n"; } ]
    )->then(
        function ($res) use($i) {
            echo "ok $i\n";
        },
        function ($res) use($i) {
            echo "ng $i\n";
        }
    );
}

$results = \GuzzleHttp\Promise\settle($promises)->wait();

実行。

$ time php test2.php 
0.187323
0.356126
ok 0
0.10658
0.138877
ok 1
0.147102
0.161913
ok 2
0.123902
0.128758
ok 3
0.117988
0.134
ok 4

real    0m1.654s
user    0m0.118s
sys 0m0.019s

直列処理になってしまいました。Clientは横に並ばないんですね。へー。