Não recomendo fazer isso, pois cada vez que é criado um novo plano de execução deve ser calculado, mas SIM, com certeza pode ser feito (Tudo é possível, mas nem sempre recomendado).
Aqui está um exemplo:
CREATE PROC [dbo].[sp_helloworld]
AS
BEGIN
SELECT 'Hello World'
DECLARE @sSQL VARCHAR(1000)
SET @sSQL = 'CREATE PROC [dbo].[sp_helloworld2]
AS
BEGIN
SELECT ''Hello World 2''
END'
EXEC (@sSQL)
EXEC [sp_helloworld2];
DROP PROC [sp_helloworld2];
END
Você receberá o aviso
The module 'sp_helloworld' depends on the missing object 'sp_helloworld2'.
The module will still be created; however, it cannot run successfully until
the object exists.
Você pode ignorar esse aviso usando EXEC('sp_helloworld2') acima.
Mas se você chamar EXEC [sp_helloworld] você obterá os resultados
Hello World
Hello World 2