No es una cuestión de cuál es mejor, en gran medida estas actividades se unen.
Por ejemplo, algunas de las amenazas triviales (por ejemplo, inyección SQL y XSS) se pueden mitigar de manera adecuada por adelantado, al elegir el diseño apropiado, usar la tecnología adecuada y definir las pautas de codificación relevantes.
Por otro lado, la mayoría de los mecanismos y mitigaciones de seguridad son irrelevantes, hasta que entienda las amenazas que está tratando de mitigar.
Y otro punto a considerar es que cualquier mecanismo de seguridad que implementes, también debe ser modelado por amenazas. Sí, a veces un "mecanismo de seguridad" en realidad introduce NUEVAS amenazas, y esto debe considerarse cuidadosamente. (Por ejemplo, anti-virus ...)
Por lo tanto, conclusión: un enfoque iterativo es mejor, involucrando el modelado de amenazas como parte de la construcción del diseño.
Al igual que hace el diseño del sistema de forma iterativa, primero la arquitectura general, luego el diseño detallado, luego los módulos / características / lo que sea, para cada iteración debe haber una TM relevante. Así por ejemplo post-arquitectura / pre-diseño puedes construir un TM trivial; ¡A medida que te metes en más detalles, TM esos detalles a medida que avanzas!