I see. If it's battery powered, then you don't want to waste current with internal pull-ups,
and you don't want one on GPIO.0 connected to the internal ULPWU current sink.

You want GPIO.0 to charge the cap through the series resistor, go to input, and let the cap
discharge through the internal current sink. Kind of defeats the purpose if you have the pin
held high via the internal pull-up.

And, if your sensor outputs logic 1 when active, you should probably avoid the while GPIO.4
since it's detecting something when GPIO.4 = 1.

A better approach might be to read the port immediately on wake-up, find out which pin
caused the interrupt on change wake up, then jump to a routine to handle it.

Maybe something like this?
Code:
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BOD_OFF & _CPD_ON & _IESO_OFF & _FCMEN_ON & _WUREN_OFF

Include "modedefs.bas"

OSCCON = %01100000 ' Internal 4MHz select
OPTION_REG.7 = 1 ' turn off current hog internal pull-ups
CMCON0 = 7 ' disable comparator
VRCON = 0 ' disable internal Vref
GPIO = %00000000 ' LED off on boot
TRISIO = %011000 ' GPIO.0 / 3,4= input, rest outputs
PIR1 = 0 ' clear peripheral int flags
IOCA.0= 1 ' int on change enabled for GPIO.0
IOCA.4=1 ' int on change enabled for sensor @ GPIO.4

Main:
  IF GPIO.4 THEN HandlePIR ' goto PIR detect routine
  GPIO.0= 1 ' set data latch on GPIO.0
  TRISIO.0= 0 ' GPIO.0 = output (charging cap)
  PAUSEUS 100 ' charge cap for 1
  PCON.5 = 1 ' ultra low power wakeup enabled
  TRISIO.0= 1 ' GPIO.0 = input to discharge cap
  INTCON= %00001000 ' globals disabled, int on change enabled, clear wake up int flag bit
  @ SLEEP ' put PIC to sleep
  IF GPIO.4 THEN
    PCON.5 = 0 ' disable current sink on ultra low power wakeup
    GOTO HandlePIR ' if PIR sensor woke us up, handle it
  ELSE
    GOSUB Test ' go test for under voltage condition AND send data if pin is made high by 
  ENDIF
  GOTO Main