Вам нужно написать один оператор SELECT, который возвращает строки в точности так, как вы хотите, чтобы они были вставлены.
2 внутренних выбора, которые вы получили, возвращают все идентификаторы из tbl_id и все сообщения из tbl_msg, что не имеет особого смысла.
Сначала напишите выбор, например ::
SELECT tbl_id.id, tbl_msg.msg
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)
Тогда используйте его для ВСТАВКИ:
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, tbl_msg.msg
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)
ОБНОВЛЕНИЕ в соответствии с комментариями ОП:
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, single_msg.msg
FROM tbl_id
JOIN (SELECT msg
FROM tbl_msg
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d')
ORDER BY date_time DESC LIMIT 1) as single_msg ON 1=1;
Это будет не очень эффективно, потому что внутренний выбор будет выполняться для каждой записи в tbl_id. Более эффективное решение может быть:
SELECT msg INTO @msg
FROM tbl_msg
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d')
ORDER BY date_time DESC LIMIT 1;
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, @msg
FROM tbl_id;