SQL Server is turning the OJ into an IJ because of the inner-joined "trail". You can get around it by changing the position of the ON clauses like this:
SELECT P.policy_internal_id,
RTRIM(P.contract_main_id)
+ CASE P.contract_sub_id
WHEN '00' THEN ''
ELSE P.contract_sub_id END
+ CASE
WHEN PAN.value_num IS NULL THEN ''
ELSE '-' + CONVERT(VARCHAR(9), CONVERT(INT, PAN.value_num)) END
[rpt_policy_contract]
FROM dbo.POLICY P
LEFT OUTER JOIN dbo.POLICY_ATTRIBUTES_NUM PAN
inner JOIN dbo.PRODUCT_ATTRIBUTES PA
inner JOIN dbo.PRODUCT_POSSIBLE_ATTRIBUTES PPA
ON PA.prod_poss_attr_id = PPA.prod_poss_attr_id AND PPA.prod_attr_logical_key = 'NB_RENEWAL'
ON PAN.prod_attr_id = PA.prod_attr_id
ON P.policy_internal_id = PAN.policy_internal_id
The real question is...why do you want an indexed view? Is it because this query isn't performing as you might expect it to?
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden