Sorun şu şekilde çözüldü:

TableA::select('tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price')
         ->join(DB::raw("(SELECT id, start_date, end_date, pro_id, price,
         DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff
         FROM `tableB` GROUP BY id order by diff asc) tableB "), function ($join)
        {
              $join->on('tableA.id', '=', 'tableB.pro_id');
        })
        ->whereDate('tableB.end_date','>=','2021-03-07')
        ->groupBy('tableA.id')->orderBy('price','DESC')->get();