Try using the %defstr directive to quote the argument.
BITS 32
%macro incdef 1
%push _incdef_
%defstr %$file %{1}
%include %{$file}
%pop
%endmacro
incdef SYSTEM_CALLS
SECTION .text
GLOBAL _start
_start:
sys_write 1, msg_str, msg_len
sys_exit 0
SECTION .data
msg_str db "Hello, World!", 10
msg_len equ ($-msg_str)
%macro sys_write 3
mov edx, %3
mov ecx, %2
mov ebx, %1
mov eax, 4
int 80h
%endmacro
%macro sys_exit 1
mov ebx, %1
mov eax, 1
int 80h
%endmacro
$ ls
demo.asm macros.asm
$ nasm -f elf demo.asm -DSYSTEM_CALLS=macros.asm
$ ls
demo.asm demo.o macros.asm
$ gcc -nostartfiles demo.o -o demo
$ ./demo
Hello, World!
$