Primeiro, este não é um "problema de design gritante". SQL é uma linguagem descritiva da saída, não uma linguagem procedural que especifica como o processamento está sendo feito. Não há garantia da ordem de processamento, em geral, e isso é uma vantagem. Eu poderia dizer que há um problema de design, mas é em torno do tratamento geral de exceções em instruções SQL.
De acordo com a documentação do SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), você pode depender da ordem de avaliação para uma instrução CASE para expressões escalares . Então, o seguinte deve funcionar:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
Ou, para chegar mais perto de uma expressão "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)
Pelo menos seu código está fazendo um CAST explícito. Essa situação é muito mais desagradável quando as conversões são implícitas (e existem centenas de colunas).