Build a trie from all words. DFS from each cell, following the trie.
At each cell, check if the current character exists in the current trie node. If yes, continue DFS to neighbors while descending in the trie. If you reach a word ending in the trie, add that word to results.
This searches for all words in a single board traversal. Prune paths that don't lead anywhere in the trie.
Mark visited cells during DFS. Remove found words from trie to avoid duplicates.