Have you tried the updated_at column instead? If you increase the comments_count every time there is a new comment for your post, then the updated_at column is what is the latest:
$posts = Post::where('updated_at', '>=', Carbon::now()->subDays(2))
->latest('updated_at')
->orderBy('comments_count', 'desc')
->paginate(20);