Of course I can fill a temp table and apply the WHERE clause on a "SELECT * FROM #TEMP" statement. This approach has been discussed in forums for ages. But why are we relying on SQL Server to produce good execution plans where we could just staple together a bunch of temp tables filled using cursors while being at it. Moreover, some third parties applications are only able to connect to SQL Server using views. In other words, it would be nice to tell SQL Server to materialize subquery X in: "SELECT X.Value1 FROM (SELECT Value1, Value2 FROM Table) X WHERE X.Value2 = 'F'". I would definitely prefer this over creating a temp table.
Though I am not expecting SQL Server to produce the optimal execution plan of each statement, the actual case produces a plan that executes in 1/10 of a second or 80 seconds on my local SQL Server. I think that SQL Server can do better.
Using a TOP <large number> forces the materialization of the subquery and results in a fast execution plan. That is a solution I favor over the use of a temporary table.
SELECT TOP 10000000
FROM Corporation2 C
LEFT JOIN EntityAttributes2 EA ON EA.EntityID = C.CorporationID
OUTER APPLY (
SELECT TOP 1 NameID FROM CorporationHistory2
WHERE CorporationID = C.CorporationID AND EffectiveDate <= '2021-09-30'
ORDER BY EffectiveDate DESC
LEFT JOIN EntityName2 EN ON EN.EntityNameID = CH.NameID
WHERE IsArchived = 'F' AND Name IS NOT NULL