Here's a solution using only ubiquitous shell tools.
This should be easily done by forking the slow process and a sleep in the background and waiting for the first to finish, except that the wait shell builtin waits for all jobs to finish rather than only for the first one.
So instead, fork the slow process and a sleep in the background, have them both report their status through a pipe, and read the first status that comes out of the pipe.
fifo=$(mktemp -u) # if not on Linux, adapt to what your OS provides mkfifo -m 600 "$fifo" { ./slowprocess.sh; echo z >$fifo;>"$fifo"; } & payload_pgid=$! {sh sleep-c 'sleep 3; echo a >$fifo;a' }>"$fifo" & sleep_pgid=$! read status <$fifo case $status in a) echo "That process is taking a long time"; read ignored <$fifo;; z) echo "Done already"; kill -INT -$sleep_pgid;; esac rm "$fifo"