Poll function for a BoolProperty
There is no poll function for Properties.

HOWEVER:
You can skip the property in the layout or (even better) block the layout (layout.enable=False) so it can be seen but not used.
You can also fake the behaviour within the update-funktion, but you'll need a second property.
Finally you can define getter, and setter functions for your property.

BLOCK THE LAYOUT:

row = layout.row()
row.enable = False
row.prop(self, 'MyBool') #this will appear grayed out


GETTER &amp; SETTER:

def get_MyBool(self, context):
    return self.MyBool_internal
def set_MyBool(self, context, value):
    if not self.dont_touch_MyBool:
        self.MyBool_internal = value
MyBool_internal = bpy.props.BoolProperty() # This is where its actually stored
MyBool = bpy.props.BoolProperty( # This is for your user-interface
         name='MyBool', get=get_MyBool, set=set_MyBool)


ABUSING THE UPDATE-FUNCTION: (Documentary only. Avoid if possible.)

def update_MyBool(self, context):
    if self.dont_touch_MyBool: # condition to check if changing mybool is allowed
        self.MyBool = self.MyBool_Backup
    else:
        self.MyBool_Backup = self.MyBool
MyBool = bpy.props.BoolProperty(name='MyBool', update=update_MyBool)


You can read more about bpy.props here

BLOCKING CERTAIN INPUT:

Let's say you'd like to define an integer that may NOT accept multiples of 2 or 3.

# this will only be called if a valid entry is made
def upd_MyInt(self, context):
    print('Entry accepted')
# This is where its actually stored
MyInt_Internal = bpy.props.IntProperty()

# This is for your user-interface
def get_MyInt(self, context):
    return self.MyInt_internal
def set_MyInt(self, context, value):
    if value%2 and value%3:
        self.MyInt_internal = value
MyInt = bpy.props.IntProperty(get=get_MyInt, set=set_MyInt)