Not a programming question, but I feel it warrants a response nonetheless.
Angular can be used for good, loosely-coupled & individually testable code, or bad, tightly-coupled hard-to-test-in-isolation code. There's nothing inherent to Angular that requires one or the other; it's up to the developer to architect things so only those parts that should depend on each other, do.
For example, controllers should be tightly coupled to their templates/views. However, they should not be tightly coupled to the business logic that populates the view in general; hence we have services to abstract that part away.
Also, reusable components should be made into directives & their code not repeated. This makes code more DRY, which results in more maintainable & testable code.
That said, the extent to which code needs to be abstracted depends on the size of the project, its expected lifecycle, deadlines, etc... But, there isn't anything inherent to Angular that results in poor separation of concerns, and plenty of constructs to facilitate it.
UPDATE
There's already a question on how to structure large Angular applications which provides advice on how to implement some of the above in practice.
There's also a style & best practices guide provided by the Angular team with more practical advice (linked from the above question).
UPDATE 2
Right from the Angular unit-testing page, which summarizes the above in 2 sentences:
With great power comes great responsibility
Angular is written with testability in mind, but it still requires
that you do the right thing. We tried to make the right thing easy,
but if you ignore these guidelines you may end up with an untestable
application.