Normally I would have told you to use a recursion
WITH Dates AS (
SELECT [Date] = @startdate
UNION ALL
SELECT [Date] = DATEADD(DAY, 1, [Date])
FROM Dates
WHERE Date < @enddate)
SELECT [Date]
FROM Dates
But as you have this strange demand that you don't want to use any loops, I searched and found this oddity on Stackoverflow.
select a.Date
from (
select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2010-01-20' and '2010-01-24'
It's actually quite performant.
If you need more than a thousand days you need to add more source tables to the cross join.