The shell will definitely not spontaneously kill its subprocesses — after all a background job is supposed to run in the background and not care about the life of its parent. (An interactive shell will in some circumstances kill its subprocesses when it exits — which is not always desirable, hence
You can make the shell script kill its background jobs when it exits or is killed by a catchable signal. Record the process IDs of the jobs, and kill them from a trap. Note that this only kills the jobs (as in, the original process that's started in the background), not their subprocesses.
trap '((#jobs == 0)) || kill $jobs' EXIT HUP TERM INT
subscript1 & jobs+=($!)
subscript2 & jobs+=($!)
If you want to be sure to kill all processes and their subprocesses, more planning is in order. One method is to arrange for all the processes to have a unique file open. To kill them all, kill all the processes that have this file open. A subprocess can escape by closing the file.
fuser -k "$lock_file"