Как решить проблему с N + 1 запросом БД при выборке модели с getNameAttribute?
Вот это должно работать:
public function reviews(): HasManyThrough
{
    return $this->hasManyThrough(
        Review::class,
        Comment::class,
        'commentable_id',
        'reviewable_id'
    );
}

public function getCommentsCountAttribute(): int
{
    return $this
        ->reviews
        ->where('commentable_type', Review::class)
        ->count();
}

Ну и да, при выборке вы должны указать, что хотите для коллекции постов жадно загрузить comments.
Получается 3 модели Post, Review, Comment.
Нет смысла делать модель Review. Это одинаковая с Comment сущность. Добавляется поле parent_id и "Review" это будет Comment со скоупом whereNull parent_id. 
public function scopeParents($query)
{
    return $query->whereNull('parent_id');
}
А у комментариев отзыва parent_id == id отзыва. И будет структура, как на Тостере. 
Если отзывы и комменты добавляются к разным моделям (посты, товары и тд) то стандартная полиморфная связь.
В модели коммент
public function commentable():
{
    return $this->morphTo();
}

В трейте, который нужно добавить ко всем моделям у которых есть комменты

public function comments()
{
    return $this->morphMany('App\Models\Comment', 'commentable');
}

Количество комментариев считать как обычно методом withCount. Просто для "отзывов" добавлять скоуп ->parents() к отношениям.