The problem here is that col_2, the non-nullable column, has a bigger data type than the nullable col_1. If you change col_2 to be varchar(40), col_3 is considered to be non-nullable.
I can't say why you get this result when col_2 has a bigger data type, but I tried this on some older versions of SQL Server, and I found that on SQL 2000 col_3 was considered non-nullable even when col_2 is varchar(50). Whereas SQL 2005 behaves as in your example - but only in compatibility level 90. In compat level 80, I got the SQL 2000 behaviour. This suggests that it is an intentional change, and not some form of regression bug. (On SQL 6.5, even further back, all computed columns were considered nullable.)
Important to keep in mind here is that the return type of isnull is always the data type of the first argument. Thus, the data type of col_3 is varchar(40).