Remove the 'Select' ! (and also remove some escaped single quotes)
In other words...
set @cmd=
'exec msdb.dbo.sp_update_job @job_id='''
+ convert(nvarchar(255), job_id)
+ ''', @owner_login_name=''sa'';'
Note: not quite sure where this last thing fits (probably at the end of the sp_update_job statement.
-- from msdb..sysjobs'
Essentially what was going on, with the SELECT statement was that the dynamic SQL being executed was a select statement which happen to select a string dynamically crafted. SQL would then print that string, just as if the SELECT statement had been, say:
select 'Once upon a time, a very poor lumberjack..."
(Whatever is in the string after select doesn't affect SQL in any way)
Now, as is more obvious with Remus' nice formatting of the question, the dyanamic SQL statement itself seems to be wrong, but at least SQL will try to execute it, now...