Esse comentário no MSDN simplesmente significa que existem algumas situações (como, por vezes, ao usar o SQL dinâmico) em que a concessão de um EXECUTAR ao usuário no procedimento armazenado não será necessariamente suficiente para permitir que ele seja executado.
O que você quer não pode ser feito - se eles são capazes de executar um procedimento armazenado, eles serão capazes de fazer o que o procedimento armazenado fizer - INSERT, DELETE, UPDATE, whatever. Até mesmo SELECTs podem fazer alterações via SELECT INTO. E há sempre tabelas temporárias ou variáveis de tabela para complicar qualquer tentativa de identificar uma lista de sps seguros / inseguros.
Meu conselho é diminuir o máximo possível o que o usuário somente leitura realmente precisa ler, criar uma função db com permissões EXECUTE para apenas esses objetos e iniciar a partir daí. E espero que você não esteja dando permissões de EXECUTE para a função Public, porque se for assim você terá que DENY EXECUTE em todos os outros procedimentos armazenados também.