EDIT
Rob Farley's answer (thanks!) is great and works perfectly for the question as I originally asked it, in which I implied I was joining a single table.
As it is, I have multiple such tables and I was unable to reconcile all using INNER JOINs in order to use that solution.
For the moment I have worked around this by adding a "NULL" row to the lookup tables so I can use an INNER JOIN without losing any rows on the left.
In my case I use uniqueidentifier identities, so I create an indexed view like this:
CREATE VIEW [dbo].[ParentView] WITH SCHEMABINDING AS SELECT P.Id, L.Name FROM [dbo].Parent P INNER JOIN [dbo].Lookup L ON ISNULL(P.LookupId, '00000000-0000-0000-0000-000000000000') = L.Id I then add a row to the Lookup table with a value of 00000000-0000-0000-0000-000000000000 for Id so there is always a match on the right of the join.
I can then create indexes on that view as needed.
Also, as I'm not using Enterprise, I found I needed to use the NOEXPAND hint to ensure those indexes are used:
SELECT * FROM [ParentView] WITH (NOEXPAND) ORDER BY Name OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY