Tecnicamente... sim, você poderia, mas isso não significa que você deveria. Você teria que ter cuidado para evitar instruções GO (basta usar Exec para cada lote), mas você poderia fazer algo como:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE dbo.Test
AS
Declare @Sql nvarchar(max)
Set @Sql = 'CREATE FUNCTION dbo.Foo
(
)
RETURNS TABLE
AS
RETURN
(
SELECT 0 As Bar
)'
Exec(@Sql)
Select *
From dbo.Foo()
Set @Sql = 'Drop Function dbo.Foo'
Exec(@Sql)
Return
GO
Exec dbo.Test
Dito isto, eu recomendo fortemente contra esse tipo de solução, especialmente se a função que você deseja é algo que seria útil como uma função Split. Eu recomendaria apenas criar o UDF e usá-lo e deixá-lo até que você possa usá-lo novamente.