a) if you convert the datetime with format 120 (or 126) you'll get a better, internationally safe ISO format yyyy-mm-dd which can never be misinterpreted
b) You have declared @bom as datetime, but then assign a varchar to it. If you declare it as varchar instead, it can then be used to build the SQL afterwards.
c) This kind of thing works ( http://sqlfiddle.com/#!6/92119/4 )
declare @eff_date smalldatetime
set @eff_date = dateadd(dd,-(day(getdate())-1),getdate())
declare @bom varchar(30)
set @bom = convert(varchar(20),@eff_date,120)
DECLARE @sqq NVARCHAR(300)
set @sqq = 'select 1, '''+@bom+''',3'
exec sp_executesql @sqq;
... hopefully you'll be apply that to your openquery