Found a solution almost directly after posting,
To follow up, I solved the problem by adding a package declaration to the beginning of the migration script files that matches the folder structure. Not sure if it's a Grails change or a Groovy change that caused the problem, but the files were being compiled into a the target/classes directory using the declared package structure (which in this case was nothing, resulting in them being at the root folder). However, Grails was detecting the files in the file structure and creating Spring FileSystemResources with paths to match that. These were passed to the DefaultGrailsApplication constructor and the ClassLoader failed to the find the classes at the matching locations.
grails-app/migrations/releases/release_1/foo.groovy -> target/classes/foo.class
By adding 'package releases.release_1' to the beginning of foo.groovy, then the following occurred:
grails-app/migrations/releases/release_1/foo.groovy -> target/classes/releases/release_1/foo.class
Then the ClassLoader found the corresponding class file for the FileSystemResource.