I would be inclined to use a function. Something like:
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
CREATE FUNCTION dbo.GetAssetNames
(
    @policy_number varchar(20) -- or whatever the datatype of policy_number is.
)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @AssetNames varchar(8000)
    SET @AssetNames = ''
    SELECT @AssetNames = @AssetNames
        + CASE
            WHEN CHARINDEX('(', asset_name) > 0
            THEN LEFT(asset_name, CHARINDEX('(', asset_name) - 1)
            ELSE asset_name
        END
        + '#'
    FROM asset
    WHERE policy_number = @policy_number
    RETURN LEFT(@AssetNames, LEN(@AssetNames) - 1)
END
GO
SELECT
    policy_number
    ,ulp_order_id
    ,dbo.GetAssetNames(policy_number) AS asset_name
FROM ulp_order