What is the recommended method of storing statements used in timer jobs?
I think any answer to this question will be 'mostly' opinion based.  

When I think of 'best practices' and comparing options, I think:


Is one way more secure?  
Is one way easier to maintain?
Is one way adhering to company policy better?
Is one way more efficient or perform better?


Sql Server Agent Job information (and encapsulated code) is stored in the MSDB system database.  

It's often desirable to emulate a lot of processes in other 'non-production' environments and people frequently back up their production user database(s) and restore them to 'test' environments.  Storing your code in a user database (as a SP or Function) allows for that functionality to more easily be restored to a non-production environments during a 'refresh'.  Storing this functionality in a Sql Agent Job limits that flexibility because you either have to manually edit the non-production job or script out the production job and recreate the job in the non-production environment.  This can lead to production and non-production code not matching because someone didn't script the changes in the agent job.

Ultimately, you have to decide what works best for your company