El UDF es un cuadro negro para el optimizador de consultas, por lo que se ejecuta para cada fila. Está haciendo un cursor de fila por fila. Para cada fila de un activo, busque una identificación tres veces en otra tabla. Esto sucede cuando usa UDF escalares o de declaraciones múltiples (los UDF en línea son simplemente macros que se expanden en la consulta externa)
Uno de los muchos artículos sobre el problema es "Funciones escalares, interlineado y rendimiento:un título entretenido para una publicación aburrida".
Las subconsultas se pueden optimizar para correlacionar y evitar las operaciones fila por fila.
Lo que realmente quieres es esto:
SELECT
uc.id AS creator,
uu.id AS updater,
uo.id AS owner,
a.[name]
FROM
asset a
JOIN
user uc ON uc.user_pk = a.created_by
JOIN
user uu ON uu.user_pk = a.updated_by
JOIN
user uo ON uo.user_pk = a.owned_by
Actualización de febrero de 2019
SQL Server 2019 comienza a solucionar este problema.