Well, this just cost me an hour of my time stumbling across a similar problem, although not with files but a relation. It might be worth updating the documentation to mention this caveat, cause the event afterSave does indeed suggest that, after all models, (and why would I assume not the related -deferred- models?) are saved they will be available.

The following will thus never work:

// Gallery Model with a hasMany images relation
public function afterSave()
{       
    // Since it is believed that this event is triggered AFTER saving, every sane developer will assume 
    // that this includes the related images 
    $records = $this->images->each(function ($image, $key) {
        // Will never enter this iteration on creation of the Gallery Model because $this->images is EMPTY
        if (is_null($image->sort_order)) {
            $image->sort_order = $key;
            $image->save();
        }
    });
}

I tried replacing $this->images->each with $this->withDeferred('images') (as seen from @LukeTowers at this last comment, but this just returns an error that the method withDeferred is undefined.

After some further RTFM'ing I found the solution:

public function afterSave()
{       
    $sessionKey = post('_session_key');
    $records = $this->images()->withDeferred($sessionKey)->each(function ($image, $key) {
        if (is_null($image->sort_order)) {
            $image->sort_order = $key;
            $image->save();
        }
    });
}