Is there a way to do the following query with joins instead of a sub query?
this just trying to figure out your syntax:  

    SELECT eu.[Name],
           pp.[MonthDay] --date type,
           pp.[Value] *  ( SELECT TOP 1 [Factor] 
                             FROM [em].[CO] co 
                            WHERE co.[EUID] = eu.[Name] 
                              AND co.[MonthDay] &lt;= pp.MonthDay 
                            ORDER BY [MonthDay] DESC 
                         ) AS [CO] 
    FROM em.[PPGenData] pp
    JOIN em.[PPEUID] eu
             ON eu.ID = pp.ID


I think this will work:

select *  
(     
    SELECT eu.[Name],
           pp.[MonthDay] --date type,
           pp.[Value] * co.[Factor] as [ValueTimesFactor],
           row_number over(partition by co.[EUID] order by co.[MonthDay] DESC) as rn
      FROM em.[PPGenData] pp
      JOIN em.[PPEUID] eu
               ON eu.ID = pp.ID
      JOIN em.[CO] co 
               on co.[EUID] = eu.[Name] 
              AND co.[MonthDay] &lt;= pp.MonthDay 
)     tt 
where tt.rn = 1 


or

SELECT eu.[Name], pp.[MonthDay], pp.[Value],
       pp.[Value] * max(co.[Factor]) as [ValueTimesFactor],
  FROM em.[PPGenData] pp
  JOIN em.[PPEUID] eu
           ON eu.ID = pp.ID
  JOIN em.[CO] co 
           on co.[EUID] = eu.[Name] 
          AND co.[MonthDay] &lt;= pp.MonthDay  
 GROUP BY eu.[Name], pp.[MonthDay], pp.[Value]