This should do it:
SELECT t.id AS group_id,
t.name AS group_name,
MAX(CASE t.row_num WHEN 1 THEN t.date ELSE NULL END) AS date_1,
MAX(CASE t.row_num WHEN 2 THEN t.date ELSE NULL END) AS date_2,
MAX(CASE t.row_num WHEN 3 THEN t.date ELSE NULL END) AS date_3
FROM (SELECT t1.id,
t1.name,
t2.date,
ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY t2.date DESC) row_num
FROM TAB_1 t1
LEFT OUTER JOIN TAB_2 t2
ON t1.id = t2.group_id) t
GROUP BY t.id, t.name
It uses ROW_NUMBER() to rank dates for each group, and then selects the correct one for each column.
First step: rank the dates for each group
[group_id] [group_name] [date] [row_num]
1 Group 1 2018-03-09 1
1 Group 1 2018-03-06 2
1 Group 1 2018-03-03 3
2 Group 2 2018-03-08 1
3 Group 3 NULL 1
Second step: direct dates to the right column
[group_id] [group_name] [date_1] [date_2] [date_3]
1 Group 1 2018-03-09 NULL NULL
1 Group 1 NULL 2018-03-06 NULL
1 Group 1 NULL NULL 2018-03-03
2 Group 2 2018-03-08 NULL NULL
3 Group 3 NULL NULL NULL
Third step: get the MAX() for each column
[group_id] [group_name] [date_1] [date_2] [date_3]
1 Group 1 2018-03-09 2018-03-06 2018-03-03
2 Group 2 2018-03-08 NULL NULL
3 Group 3 NULL NULL NULL
It looks like MySQL doesn't have this analytic function though. I don't have much experience on MySQL, but maybe you could make it work anyway. Please check this out: ROW_NUMBER() in MySQL