При группировке все поля, не включённые в GROUP BY или в агрегатные функции берутся из первой попавшей в группу строки. А в стандарте SQL такие поля вообще запрещены (в MySQL 5.7.5 и выше поведение по умолчанию стало соответствовать стандарту).
SELECT *
FROM (
SELECT `id`, MAX(`date`) AS `max_date`
FROM `tab2`
GROUP BY `id`
) AS `max`
JOIN `tab2` ON `tab2`.`id` = `max`.`id`
AND `tab2`.`date` = `max`.`max_date`
JOIN `tab1` ON `tab1_id` = `tab2_id`
В MySQL 8 добавили оконные функции, с ними решается проще
SELECT *
FROM (
SELECT DISTINCT FIRST_VALUE(`id`) OVER `win` AS `id`,
FIRST_VALUE(`date`) OVER `win` AS `date`,
FIRST_VALUE(`loc`) OVER `win` AS `loc`
FROM `tab2`
WINDOW `win` AS (PARTITION BY `id` ORDER BY `date` DESC)
) AS `t2`
JOIN `tab1` ON `tab1`.`id` = `t2`.`id`