Why am I unable to load scripts in head in plugin?

This happens because of the order of execution of your WordPress page. In your code it goes like this:

  1. At init, which is early in the generation process of the page, you are registering the scripts. That is, you are telling WP that you want to use these later on. No html is generated.
  2. At init you are also registering a shortcode. This means that you are defining a function that will be triggered once the shortcode has been encountered. No html is generated.
  3. WP then goes on generating the html. First the head of the page, menus and so on, until it comes to the post content.
  4. In the post content it finds the shortcode and starts executing the function my_shortcode you have defined. Inside this function it finds wp_enqueue_script. At this point the html of the head already has been generated. So it has no choice but placing the html with the scripts in the footer of the page.

If you want the scripts in the head, you must make sure wp_enqueue_scripts is triggered at init. Of course, this means they will also be enqueued when there is no shortcode in the content.