Try nesting the select statements like this:
sqldf("SELECT * from left
LEFT JOIN (SELECT id, L.day, L.x, R.y
FROM left L LEFT OUTER JOIN right R
USING (id)
WHERE ((L.day - R.day) >= 3)
GROUP BY L.id, L.day
HAVING (R.day = MAX(R.day)))
USING (id, day, x)")
This could also be done as follows. It uses the fact that if max is used then the other values on the same resulting row are guaranteed to come from the same original row as the max. This is an extension to SQL that SQLite provides.
sqldf("select max(R.day) as maxRday, L.*, R.y
from left L left outer join right R
on L.id = R.id and L.day - R.day >= 3
group by L.id, L.day")[-1]