Unless you specifically need a timer, I wouldn't use that and would simply return {ok, N} or {error, not_found}; that would avoid useless copying and message passing. Something like:
If what you want is to get out of deep recursion and the above doesn't work especially well, that's what 'throw/1' is for:
Res = try find_x(N) of
Val -> {ok, Val}
catch
throw:not_found -> {error, not_found}
end.
This will allow to avoid the stack, special cases for returning values and give you the code result you need.
The spawning of a process for a simple use case like this is only worth it if you need a timer to give a maximum execution time for a given request. Otherwise, it's not very useful, clear or efficient. I'd mark it as 'concurrency for the sake of it'.