Просто наткнулся на эту тему в Google.
Синхронный GM_xmlhttpRequest ВОЗВРАЩАЕТ результат вместо выполнения его в обратном вызове onload.
Так что это было бы правильно:
var details = GM_xmlhttpRequest({
method:"GET",
url:"http://site.com/sample/url",
synchronous: true
});
a = details.responseText;
Вы создаете переменную "a" в начале, никогда не заполняете ее и не возвращаете Следовательно, оно не определено.