You can do this with a CTE (or a temporary table or a table variable)
;;;;with cte as
(
select [date]
from @tab
group by [date]
having COUNT(*) = 4
)
select max([date]) from cte
where [date] <= @rundate;
The first part is ensuring that I only look at dates where all four processes are present.
The final part looks for the maximum date before the run date selected. I used
declare @rundate date = '2023-06-28';
Just for completeness - I set up your sample data as follows
declare @tab table (processID int, [date] date);
insert into @tab (processID, [date]) values
(75,'2023-06-26')
,(18,'2023-06-27')
,(75,'2023-06-27')
,(89,'2023-06-27')
,(98,'2023-06-27')
,(18,'2023-06-28')
,(18,'2023-06-29')
,(75,'2023-06-29')
,(89,'2023-06-29')
,(98,'2023-06-29');