You can use fuzzyjoin
here :
fuzzyjoin::fuzzy_inner_join(df, date_lookup,
by = c('date' = 'start', 'date' = 'end'), match_fun = list(`>=`, `<=`))
# A tibble: 2 x 5
# record date start end id
#
#1 A 2020-02-15 2020-02-01 2020-02-28 2
#2 B 2020-01-03 2020-01-01 2020-01-31 1
Using tidyverse
functions :
tidyr::crossing(df, date_lookup) %>% dplyr::filter(date >= start, date <= end)