O padrão ECMAScript 5.1 seção 12.6.4 (em loops for-in) diz:
As propriedades do objeto que está sendo enumerado podem ser excluídas durante a enumeração. Se uma propriedade que ainda não foi visitada durante a enumeração for excluída, ela não será visitada. Se novas propriedades forem adicionadas ao objeto que está sendo enumerado durante a enumeração, não é garantido que as propriedades adicionadas recentemente sejam visitadas na enumeração ativa. Um nome de propriedade não deve ser visitado mais de uma vez em qualquer enumeração.
Portanto, acho que está claro que o código do OP é legal e funcionará conforme o esperado. As peculiaridades do navegador afetam a ordem de iteração e as instruções de exclusão em geral, mas não afetam se o código OPs funcionará. Geralmente, é melhor excluir apenas a propriedade atual na iteração - excluir outras propriedades no objeto fará com que sejam incluídas (se já visitadas) ou não incluídas na iteração, embora isso possa ou não ser uma preocupação, dependendo do situação.
Veja também:
Porém, nada disso realmente afeta o código do OP.