Why does abstracting html from plugin code result in loss of access to wordpress functions?

Use plugin_dir_path() to include executable files. plugins_url() returns the web address, that’s not what you need.

<?php include(plugin_dir_path(__FILE__) . 'forms/admin_form.php') ?>