You can have many conditions in the ON portion of a join - whether that is to multiple columns or expressions such as your example. The ON clause creates the relationship between the tables identified in that join statement.
The WHERE clause filters the results of all of the joins - after the data has been joined.
In your example, you are looking to get all rows from Table1 - and match only those rows from Table2 that match the key and are canceled. So you would get every row from Table1 and the columns from Table2 would either be NULL (no match found) or have a value (matched on both key and canceled).
Now - if you move that condition to the where clause you will only get all rows that match the join criteria (matching on key only) - and then filter out any rows from the results that are canceled. For all rows from Table1 where there is no match (matched on key value - not canceled) would be excluded because the NULL value returned from the outer join cannot and never will equal 'Y'.
If the column [Cancelled] comes from Table1 and not Table2 then things get trickier...because you would still get every row from Table1...but then only match on rows from Table2 for those rows in Table1 that are canceled. Again - moving the criteria to the where returns different results...because those rows where no match occurs on the join criteria would be eliminated.
This isn't really a question about how this is treated by SQL Server - it is a fundamental question on how an RDBMS uses and defines relations and how those relationships are represented in code.