Directives allow you to reuse code. I would certainly put everything that is reused into a directive. To avoid repeating yourself, you should use directives. I would even go as far as to say that even if you're not repeating yourself, i.e. the code is only in one place, you should also make it into a directive.
Directives that are used only in one place does not reduce code, but it does separate concerns. I see directives as analogous to classes. Instead of a huge block of code, class scoping enforces that classes be standalone blocks. Likewise, creating directives with their own scope makes them standalone blocks that interact with their surroundings in a limited way.
ngInclude is a little different. I would see it as the equivalent of eval, or C's #include. You do get a little separation, but everything shares the same scope, and it's easy to have parts that are intertwined, but not look like they are unless they are inspected.
As for YAGNI, I think that this is a different issue. YAGNI is talking about adding features. I am talking more about code structure than about adding anything additional. I see the same code, but organized a little differently. Sure directives take a little work to write, but like classes, they can also be light weight and created easily (in terms of the amount of thought required).