Deleting useless (dead) states from a finite automaton
Reverse all edges in the graph, and add a new state pointing at all accepting states. Find the set of states reachable from the new state in linear time (using BFS/DFS). These are the useful states (according to your definition).

The running time of this algorithm is linear in the number of states plus number of transitions.  This is about the best you can hope for (in terms of asymptotic worst-case running time).