Primero, este no es un "problema de diseño evidente". SQL es un lenguaje descriptivo de la salida, no un lenguaje de procedimiento que especifica cómo se realiza el proceso. No hay garantía del orden de procesamiento, en general, y esto es una ventaja. Podría decir que hay un problema de diseño, pero tiene que ver con el manejo general de las excepciones en las sentencias SQL.
Según la documentación de SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), puede depender del orden de evaluación de una instrucción CASE para expresiones escalares . Entonces, lo siguiente debería funcionar:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
O, para acercarse a una expresión "int":
select (case when isnumeric(c.varcharColumn) = 1 and c.varcharColumn not like '%.%' and c.varcharColumn not like '%e%'
then cast(c.varcharColumn as int)
end)
Al menos su código está haciendo un CAST explícito. Esta situación es mucho más desagradable cuando las conversiones son implícitas (y hay cientos de columnas).