Query to show each sites stock transfer history between all other sites
Here is an attempt at a rewrite, but you didn't provide any DDL or DML so there is no way for me to test it.  I'll list reasons for the changes below.

WITH Transfers_CTE (FromSiteNo, ToSiteNo, Value) AS
  (
    SELECT      Transfers.FromSiteNo,
                Transfers.ToSiteNo,
                SUM( Transfers.Value ) AS Value
      FROM      dbo.Transfers
      WHERE     Transfers.MoveDate BETWEEN @SessionDateFrom AND @SessionDateTo
                AND FromSiteNo &lt;&gt; ToSiteNo
      GROUP BY  Transfers.FromSiteNo,
                Transfers.ToSiteNo
  )
  SELECT        FromCS.No AS SiteNo,
                FromCS.Name AS SiteName,
                ToCS.No AS OtherSiteNo,
                ToCS.Name AS OtherSiteName,
                ISNULL( Transfers.Value, 0 ) AS ToFromValue
    FROM        dbo.CfgSites AS FromCS
    LEFT JOIN   Transfers_CTE AS Transfers
      ON FromCS.No = Transfers.FromSiteNo
    LEFT JOIN   dbo.CfgSites AS ToCS
      ON Transfers.ToSiteNo = ToCS.No
    WHERE       EXISTS
        ( SELECT    DescendantSites.Descendant
            FROM    dbo.DescendantSites
            WHERE   DescendantSites.Parent IN ( @SiteNo )
                    AND DescendantSites.Descendant = FromCS.No)
    ORDER BY    FromCS.No
;



Since Cs.No and JoinedSites.No should not be equal, and they are joined to the From &amp; To values of the CTE, I added the filter in the CTE to exclude any transfers where the To and From site matched.
Your Full Outer Join was effectively a left outer join because any results from the Right side table would have been excluded by the Left side reference of your EXISTS clause.
You attempt to join transfers to sites from both directions.  However, if A = B, then B = A.  So if we get all of the FromSite joins established to CS on the first pass, there is no reason to do a second pass by joining JoinedSites to the FromSite as they will already have found a match.  This change also eliminates the near Cartesian product of joining CfgSites to itself.
If we consider the CS table our anchor, understanding it has all of the From Sites included, our problem then becomes how to get the To sites.  The relationship between From and To is contained in the Transfers_CTE.  Thus we just need to join back to the CfgSites using the ToSiteNo field to find the site information.
The Sum aggregate was at the grain of the Transfer relationship, To &amp; From.  This is maintained in the changes, but now there is only one value column, returning the Value that was transferred between From and To.


There is no need to join CfgSites to itself directly, unless you may also need to show any ToFrom combinations that did not get any transfers.

Hopefully this will return your expected results.  If not, provide some DDL/DML and I may take another look at it.