The semantics of the two statements are different. The first does not set the value of the variable if no row is found. The second always sets the variable, including to null if no row is found.

The Constant Scan produces an empty row that will result in the variable being updated in case nothing matches from the base table. The left join simply ensures the empty row survives the join. Variable assignment can be thought of as happening at the root node of the execution plan.

 -- @result does not change
 DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};

 SELECT @result = AccountId 
 FROM Accounts 
 WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'};

 SELECT @result;
 GO
 -- @result set to null
 DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};

 SET @result = 
 (
 SELECT AccountId 
 FROM Accounts 
 WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'}
 );

 SELECT @result;

Documentation:

* [SET @local_variable (Transact-SQL)][1] 
* [SELECT @local_variable (Transact-SQL)][2]

> If the SELECT statement returns no rows, the variable retains its present value. If expression is a scalar subquery that returns no value, the variable is set to NULL.

> For assigning variables, we recommend that you use SET @local_variable instead of SELECT @local_variable.
 [1]: https://msdn.microsoft.com/en-NZ/library/ms189484.aspx
 [2]: https://msdn.microsoft.com/en-us/library/ms187330.aspx