If I change the stored proc definition to EXECUTE AS OWNER, creation succeeds:
CREATE PROC spFreeSystemCache
WITH EXECUTE AS OWNER
AS
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL
GO
However, when a non-sysadmin then executes this stored proc,...