The approach here is to build a 52-element array of nursing home values for each id, possibly requiring reading in multiple observation per id.  That what the  "do until (last.id)" loop below does, containing a "set have" statement inside it:
 
data have;
input id age sex $ nursing_home_id covid covid_date :yymmdd10. week1-week52 ;
format covid_date yymmdd10.;
datalines;
1 75 M 0769 1 2021/12/30 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
1 75 M 1650 0 . 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 75 M 3382 0 . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
run;
data want (keep=id age sex nursing_home_id covid week);
  do until (last.id);
    set have (rename=(covid=covid_dummy));
    by id;
    array weeks {52} week1-week52;
    array nh    {52} ;
    do w=1 to 52;
      if weeks{w}=1 then nh{w}=nursing_home_id;
    end;
    if covid_date^=. then do;
      covid_week=ceil((covid_date-'31dec2020'd)/7);
      if covid_week=53 then covid_week=52;
    end;
  end;
  do week=1 to 52;
    if week=covid_week then covid=1;
    else covid=0;
    nursing_home_id=nh{week};
    output;
  end;
run;
And thanks for submitting a "workable" data step (I had to make a couple minor changes to the DATA HAVE step).  So I can say this code has been tested.