It's not clear how USERNAME populated. I assume you have same USERNAME on project here. CTE below just build a DATE table, if you have your own date table, you can skip this part.
DECLARE @ENDDate DATETIME
SELECT @ENDDate = MAX(END_DATE) FROM tblRawData
;WITH tblDate AS
( SELECT CAST(MIN(START_DATE) AS DATE) AS [date]
FROM tblRawData
UNION ALL
SELECT DATEADD(month,1,[DATE])
FROM tblDate
WHERE [DATE] < @ENDDate
)
SELECT
d.[date]
,r.[Project]
,UserName = (SELECT MAX(USERNAME) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT)
,Percentage = (SELECT ISNULL(MAX(Percentage),0) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT AND ts.[date] <= d.[date])
FROM tblDate d
INNER JOIN tblRawData r
ON d.[date] between r.[START_DATE] AND r.[END_DATE]
ORDER BY 2,1
OPTION (Maxrecursion 0)
EDIT: Just found out the date is increased by month. I update the CTE query. However, you need make sure you have all project start and end date at first day of the month.
EDIT Base on your new sample date. the query became a little ugly now, however, it works. I can not think better solution right now.
New SQL Fiddler
DECLARE @ENDDate DATETIME
SELECT @ENDDate = MAX(END_DATE) FROM tblRawData
;WITH tblDate AS
( SELECT CAST(MIN(START_DATE) AS DATE) AS [date]
FROM tblRawData
UNION ALL
SELECT DATEADD(month,1,[DATE])
FROM tblDate
WHERE [DATE] < @ENDDate
)
,ProjectList AS (
SELECT Project,UserName
FROM tblStage1
GROUP BY Project,UserName
)
,cte AS (
SELECT
d.[date]
,r.[Project]
,UserName = pl.Username
,CloseDate = (SELECT MAX(ts.[date]) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT AND ts.UserName = pl.UserName AND ts.[date] <= d.[date])
FROM tblDate d
INNER JOIN tblRawData r
ON d.[date] between r.[START_DATE] AND r.[END_DATE]
CROSS APPLY ProjectList pl
)
SELECT cte.[date],cte.project,cte.UserName,ISNULL(t.[PERCENTAGE],0) AS PERCENTAGE
FROM cte
LEFT JOIN tblStage1 t
ON cte.PROJECT = t.PROJECT
AND cte.UserName = t.UserName
AND cte.CloseDate = t.[Date]
ORDER BY 2,3,1