Geralmente, o DAO é o mais leve possível e existe somente para fornecer uma conexão ao banco de dados, às vezes abstraído, de modo que diferentes back-ends de banco de dados podem ser usados.
A camada de serviço está lá para fornecer lógica para operar nos dados enviados de e para o DAO e o cliente. Muitas vezes, essas duas partes serão agrupadas no mesmo módulo e, ocasionalmente, no mesmo código, mas você ainda as verá como entidades lógicas distintas.
Outro motivo é a segurança - Se você fornecer uma camada de serviço que não tenha relação com o banco de dados, será mais difícil obter acesso ao banco de dados do cliente, exceto por meio do serviço. Se o banco de dados não puder ser acessado diretamente do cliente (e não houver um módulo DAO trivial atuando como o serviço), tudo o que um invasor assumiu o cliente é tentar invadir a camada de serviço antes que ele receba tudo, menos o acesso mais higienizado aos seus dados.