The UI design for storing event and event meta data is

One way of accomplishing this is by using a loop and inserting a record into a temp table. Then you can simply select from your temp table. In the example below I saved off both the unixtimestamp value as well as that value converted to datetime.
declare @enddate bigint, @intervalFactor int, @rowresult int
set @enddate = 1391040000
create table #Results
(
eventid int,
eventdate bigint,
eventdatedate datetime
)
set @rowresult = 1
set @intervalFactor = 0
WHILE (@rowresult > 0)
BEGIN
Insert #Results (eventid, eventdate, eventdatedate)
Select events.id, date.meta_value + (intrvl.meta_value * @intervalFactor)
,DATEADD(ss,date.meta_value + (intrvl.meta_value * @intervalFactor), CAST('1970-01-01 00:00:00' AS datetime))
from events
inner join events_meta date
on events.id = date.event_id
AND date.meta_key = 'repeat_start'
inner join events_meta intrvl
on events.id = intrvl.event_id
and intrvl.meta_key = 'repeat_interval_'+ CAST(date.id as Varchar(100))
where ((@enddate - date.meta_value ) % intrvl.meta_value) >= 0
and date.meta_value + (intrvl.meta_value * @intervalFactor) <= @enddate
set @rowresult = @@rowcount
set @intervalFactor = @intervalFactor + 1
END
select * from #Results
Another possible solution for this problem would to utilize a recursive CTE.