setValue:forKey:faz parte do protocolo NSKeyValueCoding , que, entre outras coisas, permite acessar propriedades de objetos como o Interface Builder. setValue:forKey:é implementado em outras classes que não NSDictionary.
setObject:forKey:é uma NSMutableDictionary'srazão para existir. Sua assinatura é bem parecida com setValue: forKey :, mas é mais genérica (por exemplo, qualquer tipo de chave). É uma coincidência que as assinaturas sejam tão semelhantes.
O que aumenta a confusão é que a implementação de NSMutableDictionary setValue:forKey:é equivalente setObject:forKey:na maioria dos casos. Em outras classes,setValue:forKey: altera as variáveis de membro. Em NSMutableDictionary, ele altera as entradas do dicionário, a menos que você prefixe a chave com um caractere '@' - nesse caso, modifica as variáveis de membro.
Então, em poucas palavras, use setObject:forKey:quando precisar trabalhar com chaves e valores do dicionário e, setValue:forKey:nos casos mais raros, em que você precisará enfrentar o KVP .
EDIT: e oh, parece que isso foi perguntado e respondido antes: Diferença entre objectForKey e valueForKey?