Hola K0ws, como te dijo Kacrack tienes que acabar con ret si lamas con call para que retorne.
Por si no te as dado cuenta de los tres calls primeros solo te hace efecto el primero ya que a las otras dos funciones las vas llamando desde otras funciones y no desde el main.
Tambien haces mal el FreeLibrary ya que en ese momento EAX = URLDownloadToFile.
Te dejo tu código corregido

include 'win32ax.inc' ;Incluimos para el uso de ciertas apis.
.data ;Seccion de datos.
remote_file db 'http://underc0de.org/foro/Themes/underc0de/images/theme/logo.png',0 ;Definimos una variable para la URL.
local_file db 'deje.png',0 ;Definimos otra variable para el nombre del archivo local.
urlmon dd ?
.code ;Seccion de codigo.
start: ;Comenzamos el codigo
call loading ;Llamamos a la subrutina para cargar las funciones necesarias.
call download ;Llamamos a la subrutina para descargar el archivo.
call execute ;Llamamos a la subrutina para ejecutar el archivo.
exit:
invoke ExitProcess,0 ;Salida del programa.
download: ;Cargamos en la pila los datos necesarios mediante push.
;push eax
push 0
push 0
push local_file
push remote_file
push 0
call eax ;llamamos a la funcion UrlDownloadToFileA (Su direccion)
;pop eax ;La sacamos de la pila.
invoke FreeLibrary, [urlmon] ; "La Liberamos"
ret
;call execute ; Nos vamos a la ejecucion del archivo.
loading:
invoke LoadLibrary, 'urlmon.dll' ;Llamamos a la libreria que contiene nuestra funcion.
mov [urlmon],eax
invoke GetProcAddress, eax, 'URLDownloadToFileA' ;Sacamos la direccion de nuestra funcion.
ret
;call download ;Una vez definida la funcion a usar, podemos para a descargar el fichero.
execute:
invoke ShellExecuteA, 0, 0, local_file, 0, 0, SW_SHOW ;Ejecutamos el archivo y salimos...
ret
;call exit ;Llamamos a la salida...
.end start ;Terminamos.
un saludo.