Only join to latest entry in subselect in a given range determined by the main select
As a possible answer, I've added a table value function to my view. But there might be much better solutions. I would be happy, if you could post your alternative ideas.

CREATE VIEW rpt.LoadingList WITH SCHEMABINDING AS
SELECT
    h.ID AS ID_Haul,
    h.DescriptiveID,
    ROW_NUMBER() OVER(PARTITION BY h.ID ORDER BY ccs.StoredOn ASC) AS Pos,
    cc.PickingNo,
    pin.PickingStorage,
    pin.TargetCountry,
    cc.[ObjID],
    cc.Customer,
    cc.Article,
    cc.Quantity,
    cc.QuantityUoM,
    cc.PackageLength,
    cc.PackageWidth,
    cc.PackageHeight,
    cc.PackageWeight,
    ccs.StoredOn,
    CAST(CASE WHEN h.Depature IS NULL THEN 0 ELSE 1 END AS BIT) AS Departured
FROM dbo.Haul h
CROSS APPLY dbo.GetAllChargeCarriersOnHaul (h.ID) ccs
INNER JOIN dbo.ChargeCarrier cc ON cc.ID = ccs.ID_ChargeCarrier
INNER JOIN dbo.PickingInfo pin ON pin.ID_ChargeCarrier = ccs.ID_ChargeCarrier

----------------------------------------------------------------------------------

CREATE FUNCTION [dbo].[GetAllChargeCarriersOnHaul]
(
    @ID_Haul INT
)
RETURNS @returntable TABLE
(
    ID_ChargeCarrier INT NOT NULL,
    StoredOn DATETIME2(2) NOT NULL
)
WITH SCHEMABINDING
AS
BEGIN
    -- Declare local variables
    DECLARE @ID_Storage INT;
    DECLARE @Arrival DATETIME2(2);
    DECLARE @Depature DATETIME2(2);

    -- Load haul data
    SELECT
        @ID_Storage = ID_Storage,
        @Arrival = Arrival,
        @Depature = Depature
    FROM dbo.Haul
    WHERE ID = @ID_Haul;

    -- Exit, if no data was found
    IF @ID_Storage IS NULL
    BEGIN;
        RETURN;
    END;

    -- Select actual data
    INSERT INTO @returntable
    SELECT
        ID_ChargeCarrier,
        MAX(StoredOn)
    FROM dbo.ChargeCarrier_Storage
    WHERE
        ID_Storage = @ID_Storage
        AND (
            @Depature IS NULL AND StoredOn &gt;= @Depature OR
            StoredOn BETWEEN @Arrival AND @Depature
        )
        AND dbo.GetLatestStorageLocationInDateRange (ID_ChargeCarrier, @Arrival, @Depature) = @ID_Storage
    GROUP BY ID_ChargeCarrier;

    RETURN;
END;

----------------------------------------------------------------------------------

CREATE FUNCTION dbo.GetLatestStorageLocationInDateRange
(
    @ID_ChargeCarrier INT,
    @FromDate DATETIME2(2),
    @TillDate DATETIME2(2)
)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN;
    RETURN (
        SELECT TOP 1 ID_Storage
        FROM dbo.ChargeCarrier_Storage
        WHERE
            ID_ChargeCarrier = @ID_ChargeCarrier
            AND (
                @TillDate IS NULL AND StoredOn &gt;= @FromDate OR
                StoredOn BETWEEN @FromDate AND @TillDate
            )
        ORDER BY StoredOn DESC
    );
END;